{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ad923218-d719-459f-bff5-c40baa4f778c",
   "metadata": {},
   "source": [
    "# 机器学习入门\n",
    "## 手写体识别理解和分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5f53d40f-5a8c-4078-9586-f4c55e228c0c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Import datasets, classifiers and performance metrics\n",
    "from sklearn import datasets, metrics, svm#support vector mechine\n",
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "eaa1dbc3-719f-4f72-80f3-25ecc1c0abde",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1797, 8, 8)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "digits = datasets.load_digits()\n",
    "digits['images'].shape\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "7d2a7c77-20a0-4a08-920d-d64e0b2e397f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "digits['target'][:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "43dca549-0f13-4d91-a040-d955308df552",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxsAAADQCAYAAABvGXwjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAEWlJREFUeJzt3W1sleX9B/BfZwlQkbWwIRIfSuPUTcVG3RwuC6BlOjJt2VYI2sxanCwzLmwkKy/M7LLN0Fe6B9xIhrjNyEQCkqmwWaB1iWNIM8ie58bzcHGRsk3nCMj9f7HQrCt/W+C6dmz5fJImnItzf++rD7/0fHufnpYVRVEEAABAYu8o9QYAAIDhSdkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALJQNgAAgCyUDQAAIAtlAwAAyGLYlI2ysrJBvXV2dp7Wedra2qKsrOyUju3s7Eyyh9ReeeWVaG5ujne9611RUVERU6dOjY0bN5Z6W2RiVk7N/v37Y+HChTFt2rSorKyMsrKyePTRR0u9LTIxJ6dmzZo1MW/evLj44otj9OjRUV1dHbfffnu89NJLpd4aGZiTU9PR0REzZ86MSZMmxciRI2PChAlxww03xLPPPlvqrWVRVhRFUepNpLBly5Y+t7/yla/E5s2bY9OmTX3W3/e+98XYsWNP+Tz79++P/fv3xwc/+MGTPvbvf/97/OY3vzntPaR0+PDhuPbaa+PQoUOxZMmSmDBhQixdujSeeeaZ6OjoiGnTppV6iyRmVk5NZ2dnNDY2Rm1tbbz73e+OlStXxooVK6K5ubnUWyMDc3Jqrrvuupg4cWI0NDRETU1N7Nu3Lx544IHYt29fbNmyJS6//PJSb5GEzMmpeeKJJ+JnP/tZTJ06NSZOnBgHDx6M73znO/GTn/wkfvCDH0RTU1Opt5jUsCkb/625uTlWr14dr7322lve75///GdUVFT8j3b19vPwww/HPffcEy+88EJMnTo1IiKOHj0aV111VYwZMyZ+/vOfl3iH5GZWBufYsWPxjnf8+2Lwtm3b4v3vf7+ycQYxJ4PzyiuvxIQJE/qsHThwIKqrq+NTn/pUfPe73y3RzvhfMCen7siRIzF58uSoqamJ559/vtTbSWrYPI1qMKZPnx5XXHFFPP/883H99ddHRUVFtLS0RMS/W+ZHPvKROO+882L06NHx3ve+NxYvXhyvv/56n4wTXcqrrq6Oj33sY7Fhw4a4+uqrY/To0XHZZZfFI4880ud+J7qU19zcHGPGjIk//vGPMWvWrBgzZkxccMEFsWjRojh8+HCf4/fv3x+f/OQn45xzzonKysq4/fbb48UXXzytp3OsXbs2Lr300t6iERFRXl4eTU1NsXXr1vjzn/98SrkMbWalv+NFA44zJ/39d9GIiJg0aVKcf/75sW/fvlPKZGgzJ4MzYsSIqKysjPLy8mSZbxdn3HfPl19+OZqamuK2226LZ599Nj772c9GRMRLL70Us2bNiuXLl8eGDRti4cKFsWrVqrjlllsGlbtjx45YtGhRfP7zn49169bFlClTYv78+YNqp0eOHIlbb701brzxxli3bl20tLTEgw8+GO3t7b33ef3112PGjBmxefPmaG9vj1WrVsW5554bc+fO7Ze3e/fuKCsrG9RPXH/1q1/FlClT+q0fX/v1r389YAbDk1mBgZmTge3cuTP27NnjKVRnMHNyYseOHYujR4/GgQMH4v77748//OEPsWjRokEfP2QUw9Qdd9xRnH322X3Wpk2bVkREsXHjxrc89tixY8WRI0eKrq6uIiKKHTt29P7f/fffX/z3h+2iiy4qRo0aVezZs6d37Y033ijGjRtXLFiwoHdt8+bNRUQUmzdv7rPPiChWrVrVJ3PWrFnFpZde2nt76dKlRUQU69ev73O/BQsWFBFRrFixondt9+7dxVlnnVW0tLS85ftZFEUxYsSIPns87oUXXigionj88ccHzGBoMyuDm5X/9OKLL/bLYngzJyc/J0VRFEeOHCmmT59ejB07tti7d+9JH8/QYk5Obk5uuummIiKKiCjGjh1brFmzZtDHDiVn3JWNqqqquOGGG/qt79y5M2677baYOHFinHXWWTFixIjeX47+7W9/O2BubW1tXHjhhb23R40aFZdcckns2bNnwGPLysr6tfgpU6b0ObarqyvOOeecuPnmm/vcb968ef3yLrroojh69GgsX758wHMfP/+p/B/Dm1mBgZmT/19RFDF//vz46U9/Gt///vfjggsuOKnjGT7MyYl985vfjK1bt8a6devipptuirlz58bKlSsHffxQMfyeGDaA8847r9/aa6+9Fh/+8Idj1KhR8dWvfjUuueSSqKioiH379sXHP/7xeOONNwbMHT9+fL+1kSNHDurYioqKGDVqVL9j//Wvf/XefvXVV+Pcc8/td+yJ1k7G+PHj49VXX+23fvDgwYiIGDdu3GnlM3SZFRiYOTmxoijirrvuisceeyy+973vRX19fZJchiZzcmLvec97ev996623xkc/+tG45557Yu7cucPq9wTPuLJxop/Ub9q0KQ4cOBCdnZ19Xur10KFD/8OdvbXx48fH1q1b+63/5S9/Oa3cK6+8Mn75y1/2Wz++dsUVV5xWPkOXWYGBmZP+jheNFStWxPLly4fdy3hy8szJ4HzgAx+IDRs2xF//+tdh9QOy4VObTsPxIRg5cmSf9WXLlpViOyc0bdq0+Mc//hHr16/vs/7DH/7wtHJnz54dv/vd7/q8xO3Ro0fjsccei+uuuy4mTZp0WvkML2fyrMBgnclzUhRFfPrTn44VK1bEsmXL4s477zytPIavM3lOTqQoiujq6orKysoTXrEZypSNiLj++uujqqoqPvOZz8TatWvj6aefjnnz5sWOHTtKvbVed9xxR1x88cXR1NQU3/72t+O5556LL3zhC/HjH/84Ivq+LOeePXuivLw85s+fP2BuS0tLXH755dHY2BiPP/54dHR0xJw5c+L3v/99n1dkgIgze1YiIlavXh2rV6/u/YNV27Zt612D487kOfnc5z4Xy5cvjzvvvDOuvPLK2LJlS+/bL37xi2zvD0PPmTwn9fX18aUvfSnWrFkTXV1dsXLlyrj55pujq6srvva1rw27l79VNuLfl8meeeaZqKioiKampmhpaYkxY8bEE088Ueqt9Tr77LNj06ZNMX369PjiF78Yn/jEJ2Lv3r3x8MMPR0REZWVl732Loog333wz3nzzzQFzR44cGRs3bowZM2bEvffeG7fccku8/PLLsX79en89nH7O5FmJiGhsbIzGxsZobW2NiIilS5f2rsFxZ/Kc/OhHP4qIiEceeSSmTp3a52327NlZ3heGpjN5Tj70oQ/Fhg0b4q677oobb7wx7r333igrK4unn36692WBh5Nh+xfEzxQPPPBA3HfffbF37944//zzS70deNsyKzAwcwIDMycnZ3hdpxnmvvWtb0VExGWXXRZHjhyJTZs2xTe+8Y1oamryxQ7/wazAwMwJDMycnD5lYwipqKiIBx98MHbv3h2HDx+OCy+8MFpbW+O+++4r9dbgbcWswMDMCQzMnJw+T6MCAACy8AviAABAFsoGAACQhbIBAABkoWwAAABZDLtXo3ryySeTZx7/A14pzZw5M3lmRMSSJUuSZ1ZVVSXPZPiZPn168sxDhw4lz4yIaGtrS57Z0NCQPJPhp7OzM3lmrq+92tra5Jk53n9Kr729PXnm4sWLk2dOnjw5eWZERHd3d/LM4fTYy5UNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALJQNgAAgCyUDQAAIAtlAwAAyELZAAAAslA2AACALJQNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALIoL/UGUmttbU2euWvXruSZPT09yTMjIsaNG5c8c9WqVckzGxsbk2dSWpWVlckzu7q6kmdGRHR2dibPbGhoSJ5JaW3fvj155owZM5JnvvOd70yeGRGxe/fuLLmU1uLFi5Nn5nicsGzZsuSZCxYsSJ4ZEdHd3Z08s66uLnlmqbiyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJCFsgEAAGShbAAAAFkoGwAAQBbKBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJBFeSlP3t3dnTxz165dyTP/9Kc/Jc+sqalJnhkRMXPmzOSZOT5PjY2NyTMZvO3btyfP7OzsTJ6ZS21tbam3wBDw1FNPJc+86qqrkmc2NDQkz4yI+PKXv5wll9K6++67k2e2trYmz7zmmmuSZ06ePDl5ZkREXV1dltzhwpUNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALJQNgAAgCyUDQAAIAtlAwAAyELZAAAAslA2AACALJQNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALJQNgAAgCzKS3nynp6e5JlXX3118syamprkmblcc801pd4CiT300EPJM9va2pJn/u1vf0uemcv06dNLvQWGgIULFybPrK6uTp6ZY58REfX19VlyKa0cj2l27tyZPHPXrl3JM+vq6pJnRuR5PFtVVZU8s1Rc2QAAALJQNgAAgCyUDQAAIAtlAwAAyELZAAAAslA2AACALJQNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALJQNgAAgCyUDQAAIAtlAwAAyELZAAAAslA2AACALJQNAAAgC2UDAADIoryUJ+/p6UmeOXPmzOSZQ0mOj2lVVVXyTAZv4cKFyTObm5uTZw6lr5NDhw6VegskluNz+tBDDyXPfOqpp5Jn5vLoo4+WegsMETU1NckzDx48mDyzrq4ueWau3I6OjuSZpfo+7coGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJCFsgEAAGShbAAAAFkoGwAAQBbKBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJCFsgEAAGShbAAAAFkoGwAAQBbKBgAAkEV5KU9eVVWVPLO7uzt5Zg49PT1Zcrdt25Y8c86cOckzoZS2b9+ePLO2tjZ5JoPX1taWPPPrX/968swc1q5dmyW3srIySy4MRo7HiB0dHckzIyIWLFiQPLO9vT155pIlS5JnDoYrGwAAQBbKBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJCFsgEAAGShbAAAAFkoGwAAQBbKBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZlJfy5DU1Nckzt23bljzzySefHBKZubS2tpZ6CwBvqbm5OXlmZ2dn8swdO3Ykz5w9e3byzIiI+vr65Jk5Pk8NDQ3JMzk5ixcvTp5ZV1eXPLOnpyd5ZkTEc889lzxzzpw5yTNLxZUNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALJQNgAAgCyUDQAAIAtlAwAAyELZAAAAslA2AACALJQNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALJQNgAAgCzKS3nympqa5Jnt7e3JM1tbW5NnXnvttckzIyK6u7uz5DK8VFZWJs+sr69Pnrlu3brkmRERnZ2dyTObm5uTZzJ4tbW1yTO3b98+JDLb2tqSZ0bkmb/q6urkmQ0NDckzOTlVVVXJM+++++7kmbnMmTMneeayZcuSZ5aKKxsAAEAWygYAAJCFsgEAAGShbAAAAFkoGwAAQBbKBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJCFsgEAAGShbAAAAFkoGwAAQBbKBgAAkIWyAQAAZKFsAAAAWZQVRVGUehMAAMDw48oGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJCFsgEAAGShbAAAAFkoGwAAQBbKBgAAkMX/Ad0HCLlccD3kAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x300 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3))\n",
    "for ax, image, label in zip(axes, digits.images, digits.target):\n",
    "    ax.set_axis_off()\n",
    "    ax.imshow(image, cmap=plt.cm.gray_r, interpolation=\"nearest\")\n",
    "    ax.set_title(\"Training: %i\" % label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b2e57bda-8f87-4fce-8028-8a9e19986023",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "34dc15b1-73d7-40f1-96ab-3411abd2ca49",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1797, 64)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# flatten the images\n",
    "n_samples = len(digits.images)\n",
    "data = digits.images.reshape((n_samples, -1))#降1维\n",
    "\n",
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "be829df8-e843-4d78-8587-45140a283ca4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create a classifier: a support vector classifier\n",
    "clf = svm.SVC(gamma=0.001)\n",
    "\n",
    "# Split data into 50% train and 50% test subsets\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    data, digits.target, test_size=0.5, shuffle=False\n",
    ")\n",
    "\n",
    "\n",
    "clf.fit(X_train, y_train)\n",
    "\n",
    "\n",
    "predicted = clf.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "f70434ea-95bf-45c2-b580-8067fbef1ca7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([8, 8, 4, 9, 0, 8, 9, 8, 1, 2])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predicted[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "502b4caf-beb3-442f-9778-3d78a6a6d95a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([8, 8, 4, 9, 0, 8, 9, 8, 1, 2])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a16c6227-96b2-4c73-b82b-83d9ffe2e006",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxsAAADQCAYAAABvGXwjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAE89JREFUeJzt3X1sVfX9B/BPsQUEKlWeKhrpYOMpOpqNGSQLFPEhGhl1LsuSLbZ1GtjQrUTmNNtCRTKE6cKy6B4jDQ6XGZklw0xNZqlOUNliG9iMOkNxElHBFSWCPHh+fxC6X+UZz7eXstcr6R899973+d5yP/fcd8/tpSjLsiwAAABy1qvQCwAAAE5PygYAAJCEsgEAACShbAAAAEkoGwAAQBLKBgAAkISyAQAAJKFsAAAASSgbAABAEj2qbDQ2NkZRUVHnV3FxcZx//vlRV1cXW7Zs6ZY1VFRURG1tbef3a9asiaKiolizZs0J5axduzYaGhqio6PjkMuqqqqiqqrqE60zby+++GJUV1fH8OHDo1+/fjF27NhYsGBBfPDBB4VeGh9jTgrHnPQc5uTU8Nvf/jaKiopiwIABhV4Kh2FOCueFF16IK6+8MkpLS2PAgAExbdq0ePbZZwu9rJNSXOgFnIxly5bF2LFjY9euXfH000/HokWLoqWlJTZs2BD9+/fv1rV87nOfi3Xr1sX48eNP6HZr166NO++8M2pra6OsrKzLZffff3+OK/zk/vnPf8bkyZNjzJgxsXTp0hg8eHA8/fTTsWDBgvj73/8eq1atKvQSOQxz0r3MSc9kTgpny5YtMW/evBg+fHjs2LGj0MvhKMxJ91q/fn1MmTIlLr744njwwQcjy7JYsmRJTJ8+PZqbm+OSSy4p9BJPSI8sGxdeeGFMnDgxIiKmTZsW+/fvj7vuuiuampri61//+mFv88EHH0S/fv1yX8tZZ50VkyZNyjXzRAcotYceeih2794dK1eujFGjRkVExKWXXhpvvvlm/PrXv47//Oc/cfbZZxd4lXycOele5qRnMieFM3v27JgyZUqcc8458cgjjxR6ORyFOeleP/rRj6KsrCwef/zxzp/hZZddFiNHjox58+b1uDMcPeptVEdy8EG3efPmiIiora2NAQMGxIYNG+KKK66I0tLSmD59ekRE7NmzJxYuXBhjx46NPn36xJAhQ6Kuri7eeeedLpl79+6N2267LcrLy6Nfv37xxS9+MV544YVD9n2k03nPP/98zJgxIwYNGhR9+/aNUaNGRX19fURENDQ0xPe+972IiPjUpz7VeXryYMbhTue9++678e1vfzvOO++86N27d4wcOTJ+8IMfxIcfftjlekVFRXHzzTfHgw8+GOPGjYt+/frFhAkTYvXq1Sf8cz2opKQkIiIGDhzYZXtZWVn06tUrevfufdLZdB9z8l/mhCMxJ/+VYk4O+t3vfhctLS2n3G+UOT7m5L9SzMmzzz4bVVVVXcpaaWlpTJkyJdauXRtvvvnmSWcXQo88s/Fx//rXvyIiYsiQIZ3b9uzZE1/60pdi1qxZcfvtt8e+ffvio48+ipkzZ8YzzzwTt912W0yePDk2b94c8+fPj6qqqvjb3/4WZ555ZkRE3HTTTbF8+fKYN29eXH755bFx48b48pe/HO+///4x1/PEE0/EjBkzYty4cfHTn/40Lrjggmhvb48nn3wyIiJuvPHGePfdd+PnP/95/PGPf4xzzz03Io7crHfv3h3Tpk2L1157Le6888747Gc/G88880wsWrQoWltb47HHHuty/cceeyzWr18fCxYsiAEDBsSSJUvi2muvjZdffjlGjhzZeb2ioqKYOnXqMd/3WFNTE0uXLo1vfetbsXjx4hgyZEi0tLTEr371q5gzZ063n0Ll5JgTc8KxmZO0cxIR8fbbb0d9fX3cfffdcf755x/z+px6zEnaOdmzZ0/06dPnkO0Ht23YsKHzPvQIWQ+ybNmyLCKy5557Ltu7d2/2/vvvZ6tXr86GDBmSlZaWZlu3bs2yLMtqamqyiMgeeOCBLrf//e9/n0VEtnLlyi7b169fn0VEdv/992dZlmUvvfRSFhHZ3Llzu1xvxYoVWURkNTU1nduam5uziMiam5s7t40aNSobNWpUtmvXriPel5/85CdZRGSbNm065LKpU6dmU6dO7fz+l7/8ZRYR2cMPP9zleosXL84iInvyySc7t0VENmzYsOy9997r3LZ169asV69e2aJFi7rc/owzzsguvfTSI67x/3vppZeysWPHZhHR+fWd73wn++ijj47r9nQfc2JOODZzUrg5ue6667LJkyd3zkVNTU3Wv3//47ot3cucFGZOKisrs9GjR2f79+/v3LZ3795s5MiRWURkDz300DEzTiU98m1UkyZNipKSkigtLY1rrrkmysvL489//nMMGzasy/Wuu+66Lt+vXr06ysrKYsaMGbFv377Or8rKyigvL+9sms3NzRERh7wP8atf/WoUFx/9ZNArr7wSr732Wnzzm9+Mvn37fsJ7esBTTz0V/fv3j6985Stdth/8dIa//OUvXbZPmzYtSktLO78fNmxYDB06tPN050H79u075LaH097e3nlq8pFHHomWlpZYsmRJNDY2xo033niS94rUzMkB5oSjMScHdNecrFy5Mv70pz/Fb37zmygqKjrJe0F3MycHdNec3HLLLfHKK6/EzTffHFu2bIl///vfMXv27M68Xr161sv3Hvk2quXLl8e4ceOiuLg4hg0bdthTSf369Yuzzjqry7a33norOjo6jvje6W3btkVExPbt2yMiory8vMvlxcXFMWjQoKOu7eB7EPM8Nbx9+/YoLy8/5Il56NChUVxc3Lnegw63xj59+sSuXbtOav+33357vPfee9Ha2tr5VpApU6bE4MGD44Ybbojrr78+pk6delLZpGNODjAnHI05OaA75mTnzp0xZ86cuOWWW2L48OGdH0G6Z8+eiIjo6OiIkpISbzk8BZmTA7rreHLDDTfEO++8EwsXLoxf/OIXERFxySWXxLx582Lx4sVx3nnnnVRuofTIsjFu3LjOT0U4ksP9xmTw4MExaNCgePzxxw97m4Ot9OCDZuvWrV3+Qfft23fIA+zjDr5/8Y033jjq9U7EoEGD4vnnn48sy7rcr7fffjv27dsXgwcPzm1fh9Pa2hrjx48/5ADwhS98ISIiNm7c6EXUKcicHGBOOBpzckB3zMm2bdvirbfeinvvvTfuvffeQy4/++yzY+bMmdHU1JRsDZwcc3JAdx1PIiK+//3vR319fbz66qtRWloaI0aMiFmzZkX//v3j85//fPL956lnnYf5hK655prYvn177N+/PyZOnHjI15gxYyIiOj+RYMWKFV1u//DDD8e+ffuOuo/Ro0fHqFGj4oEHHjjkEwv+v4N/5HM8rXf69Omxc+fOQ56Aly9f3nl5SsOHD49//OMfsXPnzi7b161bFxH5/jaBwjMnJ8ec/G8xJyeuvLw8mpubD/m68soro2/fvtHc3BwLFy5Mtn+6nzn5ZPr06RMXXnhhjBgxIl5//fX4wx/+EDfddFPnH9X3FD3yzMbJ+trXvhYrVqyIq6++Or773e/GxRdfHCUlJfHGG29Ec3NzzJw5M6699toYN25cfOMb34ilS5dGSUlJXHbZZbFx48a45557DjlFeDj33XdfzJgxIyZNmhRz586NCy64IF5//fV44oknOgfpoosuioiIn/3sZ1FTUxMlJSUxZsyYLu/5O+j666+P++67L2pqaqK9vT0uuuii+Otf/xo//vGP4+qrr47LLrvspH4excXFMXXq1GO+f7C+vj6qq6vj8ssvj7lz58bgwYPjueeei0WLFsX48ePjqquuOqn9c2oyJ12ZEw7HnHR1PHPSt2/fw/4vzY2NjXHGGWeccv+DM5+cOenqeI8nGzdujJUrV8bEiROjT58+0dbWFnfffXd85jOfibvuuuuk9l1Qhf379BNz8FMR1q9ff9TrHe2TLfbu3Zvdc8892YQJE7K+fftmAwYMyMaOHZvNmjUre/XVVzuv9+GHH2a33nprNnTo0Kxv377ZpEmTsnXr1mUjRow45qciZFmWrVu3LrvqqquygQMHZn369MlGjRp1yKcs3HHHHdnw4cOzXr16dcn4+KciZFmWbd++PZs9e3Z27rnnZsXFxdmIESOyO+64I9u9e3eX60VENmfOnEPu98fXffC6H9/PkTz11FPZFVdckZWXl2dnnnlmNnr06OzWW2/Ntm3bdly3p/uYE3PCsZmTws3Jx/k0qlOXOSnMnLz88svZlClTsnPOOSfr3bt39ulPfzr74Q9/mO3cufOYtz0VFWVZlnVvvQEAAP4X/E/9zQYAANB9lA0AACAJZQMAAEhC2QAAAJJQNgAAgCSUDQAAIAllAwAASOK0+x/EOzo6cs+sra3NPbO1tTX3zIg093/NmjW5Z1ZWVuaeyfFrbGzMPbOhoSH3zM2bN+eeGRHx6KOP5p5ZXV2deyannxTPp6kee0uXLs09M8XxlMJL8dojxTElxbEvIqKqqir3zBT3v1CvvZzZAAAAklA2AACAJJQNAAAgCWUDAABIQtkAAACSUDYAAIAklA0AACAJZQMAAEhC2QAAAJJQNgAAgCSUDQAAIAllAwAASELZAAAAklA2AACAJJQNAAAgCWUDAABIQtkAAACSUDYAAIAklA0AACCJ4kLuvKOjI/fMqqqq3DPb2tpyz5w6dWrumRERLS0tuWc2NTXlnllZWZl75umqvb0998y6urrcM3uSFD9TOB719fW5Z1ZUVOSeGRFRXV2dJJfTT4rHSorXCame+2tra3PPbG1tzT2zUK+9nNkAAACSUDYAAIAklA0AACAJZQMAAEhC2QAAAJJQNgAAgCSUDQAAIAllAwAASELZAAAAklA2AACAJJQNAAAgCWUDAABIQtkAAACSUDYAAIAklA0AACAJZQMAAEhC2QAAAJJQNgAAgCSUDQAAIAllAwAASKK4kDtfunRp7pltbW25ZzY3N+ee2d7enntmRERLS0vumZWVlblnUlgDBw7MPXPHjh25Z6ZYZ0REdXV1klxOLz3lGLVp06bcMyMiysrKkuRy+uno6Mg9s6KiIvfMpqam3DMjIlatWpV75un02suZDQAAIAllAwAASELZAAAAklA2AACAJJQNAAAgCWUDAABIQtkAAACSUDYAAIAklA0AACAJZQMAAEhC2QAAAJJQNgAAgCSUDQAAIAllAwAASELZAAAAklA2AACAJJQNAAAgCWUDAABIQtkAAACSUDYAAIAkigu588rKytwzBw4cmHvm0qVLc89sb2/PPTMiYsSIEblnVldX557J8auoqMg9M8Vjuq6uLvfMVJqamnLPrK+vzz2T47dmzZrcMxsaGnLPnD9/fu6ZKZ4jItLMiePJ6SnFMaWxsTH3zFSvvVK89qyqqso9s1Cc2QAAAJJQNgAAgCSUDQAAIAllAwAASELZAAAAklA2AACAJJQNAAAgCWUDAABIQtkAAACSUDYAAIAklA0AACAJZQMAAEhC2QAAAJJQNgAAgCSUDQAAIAllAwAASELZAAAAklA2AACAJJQNAAAgCWUDAABIoijLsqzQi8hTe3t77pm1tbW5Z7a0tOSeGRExYcKE3DNbW1tzz6SwKioqcs+sqqrqEZkREXV1dblnvvjii7lnVlZW5p55uqqurs49M8VzX4rMpqam3DMj0szJo48+mntmin97OBEpjlUpXnumyDwezmwAAABJKBsAAEASygYAAJCEsgEAACShbAAAAEkoGwAAQBLKBgAAkISyAQAAJKFsAAAASSgbAABAEsoGAACQhLIBAAAkoWwAAABJKBsAAEASygYAAJCEsgEAACShbAAAAEkoGwAAQBLKBgAAkISyAQAAJKFsAAAASRQXegF5q6ioyD2zo6Mj98xU2tracs9sbGzMPbO2tjb3zNNVisff5s2bc8+sr6/PPbOysjL3zIiIurq63DPXrFmTe2aq+19oKR7Tq1atyj1zxIgRuWdWV1fnntnS0pJ7ZiopjtGcmIaGhtwzy8rKcs9McUxJpbW1NffMFD/TQnFmAwAASELZAAAAklA2AACAJJQNAAAgCWUDAABIQtkAAACSUDYAAIAklA0AACAJZQMAAEhC2QAAAJJQNgAAgCSUDQAAIAllAwAASELZAAAAklA2AACAJJQNAAAgCWUDAABIQtkAAACSUDYAAIAklA0AACCJ4kIvoCdoa2sr9BIKqqOjo9BL+J9WVlaWe2ZNTU3umQ0NDblnpjJw4MDcM6uqqnLPPF31lMd0e3t77pkVFRW5Z7a0tOSeGZHmZ1pZWZl7Jiemvr4+98zq6urcM1tbW3PPrK2tzT0zImLHjh25Z6Z4rigUZzYAAIAklA0AACAJZQMAAEhC2QAAAJJQNgAAgCSUDQAAIAllAwAASELZAAAAklA2AACAJJQNAAAgCWUDAABIQtkAAACSUDYAAIAklA0AACAJZQMAAEhC2QAAAJJQNgAAgCSUDQAAIAllAwAASELZAAAAkijKsiwr9CJOddXV1blntre3554ZEVFWVpZ7ZlNTU+6ZKdbJ8Wttbc09M8WcbN68OffMiIhly5blnllbW5t7JqefxsbG3DPr6upyz4yI2LRpU+6ZFRUVuWdyeqqsrMw9s62tLffMiIj58+fnntnQ0JB7ZqE4swEAACShbAAAAEkoGwAAQBLKBgAAkISyAQAAJKFsAAAASSgbAABAEsoGAACQhLIBAAAkoWwAAABJKBsAAEASygYAAJCEsgEAACShbAAAAEkoGwAAQBLKBgAAkISyAQAAJKFsAAAASSgbAABAEsoGAACQRFGWZVmhFwEAAJx+nNkAAACSUDYAAIAklA0AACAJZQMAAEhC2QAAAJJQNgAAgCSUDQAAIAllAwAASELZAAAAkvg/n0M3pHBdgnkAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x300 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3))\n",
    "for ax, image, prediction in zip(axes, X_test, predicted):\n",
    "    ax.set_axis_off()\n",
    "    image = image.reshape(8, 8)\n",
    "    ax.imshow(image, cmap=plt.cm.gray_r, interpolation=\"nearest\")\n",
    "    ax.set_title(f\"Prediction: {prediction}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "685623e0-5e60-4b59-ae83-1674f68be693",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier SVC(gamma=0.001):\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       1.00      0.99      0.99        88\n",
      "           1       0.99      0.97      0.98        91\n",
      "           2       0.99      0.99      0.99        86\n",
      "           3       0.98      0.87      0.92        91\n",
      "           4       0.99      0.96      0.97        92\n",
      "           5       0.95      0.97      0.96        91\n",
      "           6       0.99      0.99      0.99        91\n",
      "           7       0.96      0.99      0.97        89\n",
      "           8       0.94      1.00      0.97        88\n",
      "           9       0.93      0.98      0.95        92\n",
      "\n",
      "    accuracy                           0.97       899\n",
      "   macro avg       0.97      0.97      0.97       899\n",
      "weighted avg       0.97      0.97      0.97       899\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    f\"Classification report for classifier {clf}:\\n\"\n",
    "    f\"{metrics.classification_report(y_test, predicted)}\\n\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c66c6a96-960f-4022-bad3-fe452d905684",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Confusion matrix:\n",
      "[[87  0  0  0  1  0  0  0  0  0]\n",
      " [ 0 88  1  0  0  0  0  0  1  1]\n",
      " [ 0  0 85  1  0  0  0  0  0  0]\n",
      " [ 0  0  0 79  0  3  0  4  5  0]\n",
      " [ 0  0  0  0 88  0  0  0  0  4]\n",
      " [ 0  0  0  0  0 88  1  0  0  2]\n",
      " [ 0  1  0  0  0  0 90  0  0  0]\n",
      " [ 0  0  0  0  0  1  0 88  0  0]\n",
      " [ 0  0  0  0  0  0  0  0 88  0]\n",
      " [ 0  0  0  1  0  1  0  0  0 90]]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfIAAAHgCAYAAABej+9AAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdWdJREFUeJzt3XlcVOX+B/DPsA2LgIAsgoOggvuOKZRCqXRxuZZdcy1NzQUryVJTM3EDtZvXrSStFDW1ftclW1xoEa87oKaiuSQiKggoMAg4MDPn94cxOeIyw8CcGebzfr3Oq+bMWT6cQb7zPOc550gEQRBAREREZslK7ABERERUfSzkREREZoyFnIiIyIyxkBMREZkxFnIiIiIzxkJORERkxljIiYiIzBgLORERkRljISciIjJjLOREAE6fPo033ngDgYGBsLe3R7169dCpUycsWbIEd+7cqdV9nzx5EuHh4XB1dYVEIsGyZctqfB8SiQSxsbE1vt2nWb9+PSQSCSQSCfbv31/lfUEQ0KxZM0gkEkRERFRrH5999hnWr1+v1zr79+9/bCYic2MjdgAisa1duxbR0dFo3rw5pk6dilatWqGiogKpqalISEjAkSNHsGPHjlrb/+jRo1FSUoKtW7fCzc0NAQEBNb6PI0eOoFGjRjW+XV05Ozvjyy+/rFKsk5OT8eeff8LZ2bna2/7ss8/QoEEDjBo1Sud1OnXqhCNHjqBVq1bV3i+RqWAhJ4t25MgRTJw4Eb1798bOnTshlUo17/Xu3Rvvvfce9uzZU6sZzp49izfffBNRUVG1to9u3brV2rZ1MXjwYHz99df49NNP4eLiopn/5ZdfIjQ0FHK53Cg5KioqIJFI4OLiIvoxIaop7FonixYXFweJRII1a9ZoFfFKdnZ2+Oc//6l5rVarsWTJErRo0QJSqRReXl54/fXXcf36da31IiIi0KZNG6SkpKB79+5wdHREkyZNsGjRIqjVagB/dzsrlUqsXr1a0wUNALGxsZr/f1DlOlevXtXM+/XXXxEREQEPDw84ODjA398fr7zyCkpLSzXLPKpr/ezZsxgwYADc3Nxgb2+PDh06IDExUWuZyi7oLVu2YNasWfD19YWLiwt69eqFCxcu6HaQAQwdOhQAsGXLFs28oqIibNu2DaNHj37kOnPnzkXXrl3h7u4OFxcXdOrUCV9++SUefM5TQEAA0tPTkZycrDl+lT0aldk3btyI9957D35+fpBKpbh8+XKVrvX8/HzIZDKEhYWhoqJCs/1z587ByckJr732ms4/K5GxsZCTxVKpVPj111/RuXNnyGQyndaZOHEipk+fjt69e2PXrl2YP38+9uzZg7CwMOTn52stm5OTg+HDh2PEiBHYtWsXoqKiMGPGDGzatAkA0LdvXxw5cgQA8K9//QtHjhzRvNbV1atX0bdvX9jZ2eGrr77Cnj17sGjRIjg5OaG8vPyx6124cAFhYWFIT0/HihUrsH37drRq1QqjRo3CkiVLqiw/c+ZMZGZm4osvvsCaNWtw6dIl9O/fHyqVSqecLi4u+Ne//oWvvvpKM2/Lli2wsrLC4MGDH/uzjR8/Ht9++y22b9+OgQMH4u2338b8+fM1y+zYsQNNmjRBx44dNcfv4dMgM2bMwLVr15CQkIDvv/8eXl5eVfbVoEEDbN26FSkpKZg+fToAoLS0FIMGDYK/vz8SEhJ0+jmJRCEQWaicnBwBgDBkyBCdlj9//rwAQIiOjtaaf+zYMQGAMHPmTM288PBwAYBw7NgxrWVbtWolvPjii1rzAAiTJk3SmjdnzhzhUf88161bJwAQMjIyBEEQhP/+978CAOHUqVNPzA5AmDNnjub1kCFDBKlUKly7dk1ruaioKMHR0VEoLCwUBEEQfvvtNwGA0KdPH63lvv32WwGAcOTIkSfutzJvSkqKZltnz54VBEEQunTpIowaNUoQBEFo3bq1EB4e/tjtqFQqoaKiQpg3b57g4eEhqNVqzXuPW7dyfz169Hjse7/99pvW/MWLFwsAhB07dggjR44UHBwchNOnTz/xZyQSG1vkRDr67bffAKDKoKpnnnkGLVu2xC+//KI138fHB88884zWvHbt2iEzM7PGMnXo0AF2dnYYN24cEhMTceXKFZ3W+/XXX9GzZ88qPRGjRo1CaWlplZ6BB08vAPd/DgB6/Szh4eFo2rQpvvrqK5w5cwYpKSmP7VavzNirVy+4urrC2toatra2+Oijj3D79m3k5ubqvN9XXnlF52WnTp2Kvn37YujQoUhMTMTKlSvRtm1bndcnEgMLOVmsBg0awNHRERkZGTotf/v2bQBAw4YNq7zn6+ureb+Sh4dHleWkUinKysqqkfbRmjZtip9//hleXl6YNGkSmjZtiqZNm2L58uVPXO/27duP/Tkq33/Qwz9L5XgCfX4WiUSCN954A5s2bUJCQgKCg4PRvXv3Ry57/PhxREZGArh/VcGhQ4eQkpKCWbNm6b3fR/2cT8o4atQo3Lt3Dz4+Pjw3TmaBhZwslrW1NXr27Im0tLQqg9UepbKYZWdnV3nv5s2baNCgQY1ls7e3BwAoFAqt+Q+fhweA7t274/vvv0dRURGOHj2K0NBQxMTEYOvWrY/dvoeHx2N/DgA1+rM8aNSoUcjPz0dCQgLeeOONxy63detW2Nra4ocffsCrr76KsLAwhISEVGufjxo0+DjZ2dmYNGkSOnTogNu3b+P999+v1j6JjImFnCzajBkzIAgC3nzzzUcODquoqMD3338PAHjhhRcAQDNYrVJKSgrOnz+Pnj171liuypHXp0+f1ppfmeVRrK2t0bVrV3z66acAgBMnTjx22Z49e+LXX3/VFO5KGzZsgKOjY61dmuXn54epU6eif//+GDly5GOXk0gksLGxgbW1tWZeWVkZNm7cWGXZmurlUKlUGDp0KCQSCXbv3o34+HisXLkS27dvN3jbRLWJ15GTRQsNDcXq1asRHR2Nzp07Y+LEiWjdujUqKipw8uRJrFmzBm3atEH//v3RvHlzjBs3DitXroSVlRWioqJw9epVzJ49GzKZDO+++26N5erTpw/c3d0xZswYzJs3DzY2Nli/fj2ysrK0lktISMCvv/6Kvn37wt/fH/fu3dOMDO/Vq9djtz9nzhz88MMPeP755/HRRx/B3d0dX3/9NX788UcsWbIErq6uNfazPGzRokVPXaZv375YunQphg0bhnHjxuH27dv497///chLBNu2bYutW7fim2++QZMmTWBvb1+t89pz5szB//73P+zbtw8+Pj547733kJycjDFjxqBjx44IDAzUe5tExsBCThbvzTffxDPPPIP//Oc/WLx4MXJycmBra4vg4GAMGzYMb731lmbZ1atXo2nTpvjyyy/x6aefwtXVFf/4xz8QHx//yHPi1eXi4oI9e/YgJiYGI0aMQP369TF27FhERUVh7NixmuU6dOiAffv2Yc6cOcjJyUG9evXQpk0b7Nq1S3OO+VGaN2+Ow4cPY+bMmZg0aRLKysrQsmVLrFu3Tq87pNWWF154AV999RUWL16M/v37w8/PD2+++Sa8vLwwZswYrWXnzp2L7OxsvPnmmyguLkbjxo21rrPXRVJSEuLj4zF79mytnpX169ejY8eOGDx4MA4ePAg7O7ua+PGIapREEB64uwIRERGZFZ4jJyIiMmMs5ERERGaMhZyIiMiMsZATERGZMRZyIiIiM8ZCTkREZMZYyImIiMwYCzkREZEZYyEnIiIyYyzkREREZoyFnIiIyIyxkBMREZkxFnIiIiIzxkJORERkxljIiYiIzBgLORERkRljISciIjJjLORERERmjIWciIjIjLGQExERmTEWciIiIjPGQk5ERGTGWMiJiIjMGAs5ERGRGWMhJyIiMmMs5ERERGaMhZyIiMiMsZATERGZMRZyIiIiM8ZCTkREZMZYyImIiMwYCzkREVEtKS4uRkxMDBo3bgwHBweEhYUhJSVF874gCIiNjYWvry8cHBwQERGB9PR0vfbBQk5ERFRLxo4di6SkJGzcuBFnzpxBZGQkevXqhRs3bgAAlixZgqVLl2LVqlVISUmBj48PevfujeLiYp33IREEQaitH6C2qdVq3Lx5E87OzpBIJGLHISIiPQmCgOLiYvj6+sLKqvbalvfu3UN5ebnB2xEEoUq9kUqlkEqlVZYtKyuDs7MzvvvuO/Tt21czv0OHDujXrx/mz58PX19fxMTEYPr06QAAhUIBb29vLF68GOPHj9cpk40BP4/obt68CZlMJnYMIiIyUFZWFho1alQr27537x4CG9dDTq7K4G3Vq1cPd+/e1Zo3Z84cxMbGVllWqVRCpVLB3t5ea76DgwMOHjyIjIwM5OTkIDIyUvOeVCpFeHg4Dh8+bBmF3NnZGQBwMsUTzvVM5yzB2JbdxI5A1WVlLXaCqtSG//EhMlVKVOAgftL8Pa8N5eXlyMlVITMtAC7O1a8V8mI1Gne+iqysLLi4uGjmP6o1DtyvUaGhoZg/fz5atmwJb29vbNmyBceOHUNQUBBycnIAAN7e3lrreXt7IzMzU+dcZl3IK7s3nOtZwdmAD6em2UhsxY5A1SUxwUIuMZ3fbaIa99fJXWOcHq3nLEE95+rvR43767q4uGgV8ifZuHEjRo8eDT8/P1hbW6NTp04YNmwYTpw4oVnm4Z/9Ud33T8K/EEREZBFUgtrgSV9NmzZFcnIy7t69i6ysLBw/fhwVFRUIDAyEj48PAGha5pVyc3OrtNKfhIWciIgsghqCwVN1OTk5oWHDhigoKMDevXsxYMAATTFPSkrSLFdeXo7k5GSEhYXpvG2z7lonIiIyZXv37oUgCGjevDkuX76MqVOnonnz5njjjTcgkUgQExODuLg4BAUFISgoCHFxcXB0dMSwYcN03gcLORERWQQ11NC/c1x7fX0VFRVhxowZuH79Otzd3fHKK69g4cKFsLW9P5Zq2rRpKCsrQ3R0NAoKCtC1a1fs27dPr8F/Zn0duVwuh6urKy6f9zapwW7DZc+KHYGqi6PWiYxKKVRgP75DUVGRzgPI9FVZK7L+8DN41LqsxY1azVodplP9iIiISG/sWiciIotg6IA1Q9atTSzkRERkEdQQoKqDhZxd60RERGaMLXIiIrII7FqvA1RKYNtSfxze6YnCXFvU965Aj0G5eOmdLFQ+dOdxI86HzrqKfhNuGC1rv5H5GDQxD+5eFci8aI+Ej3xx9ng9o+2fmaqnTddiDJpwC0Fty+DhU4HYMU1wZG990fJUMrXjxEzMJAaVIEBlwIVahqxbmyyqa/37zxrhl00+GDn/Cj7+7SSGzryKHxP8sG9dQ80yn6Yd15rG/fsSJBIBz0TlGy1n+D8LMGHuTWxZ4YXoyGCcPeaEBV9nwNPP8EfwMVPtsndU48o5R3w6u3ae4lQdpnicmImZqOaIXsg/++wzBAYGwt7eHp07d8b//ve/WtvXpRPO6Bx5Bx17FsBTpkDXvrfRtkcBrpz++5tkfa8KrSltnztahRXBq7Gi1nI9bOC4fOzd4o49mz2QddkeCXP8kHfTFv1ev220DMxUPam/uSLxY18c2u0mWoaHmeJxYiZmEoO6BiZTJGoh/+abbxATE4NZs2bh5MmT6N69O6KionDt2rVa2V/zLnKkH3JF9pX7z4bNPOeICyku6PB8wSOXL8qzxalf3RA++Fat5HkUG1s1gtqVIi1Z+64+acnOaBVSYrQczFQ3mOJxYiZmEovqr1HrhkymSNRz5EuXLsWYMWMwduxYAMCyZcuwd+9erF69GvHx8TW+v/7RN1BabIOpEZ1gZS1ArZJg0LRMhL306G7zA//1gr2TCl2ijPdN08VdBWsboDBf+6MpzLOBm5fSaDmYqW4wxePETMwkFpVwfzJkfVMkWiEvLy9HWloaPvjgA635kZGROHz48CPXUSgUUCj+7uKWy+V67fPorgY4tN0Tk1ZehF9wKTLPOWFTbCDcvMvRY1BeleWTv/HCsy/nwc7e+J/ew2MqJBJA7C+DzGS+TPE4MZNumImeRrSu9fz8fKhUqirPXPX29q7ybNZK8fHxcHV11UwymUyvfW5eGID+0dcROiAf/i1L0f2VPPxj7E3s+rTqwKQ/jrkg+09HRAw1Xrc6AMjvWEOlBNw8tb/dujZQoiBPnO9dzGS+TPE4MRMziYXnyGuJRCLRei0IQpV5lWbMmIGioiLNlJWVpde+ysusNJeZVbKyFiCoq+5v/1YvBLa9i8atSvXah6GUFVa4dNoRnXoUa83v1KMY51KdjJqFmcyfKR4nZmImsaghgcqASY1H1yaxifYVqkGDBrC2tq7S+s7Nza3SSq8klUohlUqrvc+Ove5g58pG8PBToFFwKa6edcLutX5VBrOVFlvj+I8NMGz21WrvyxDb1zTA1BVZuHjaAedTndBnxG14+VXgxw0eouRhJt3ZO6rgG/D36R8fmQJNWpWiuNAGeTftRMlkiseJmZiJao5ohdzOzg6dO3dGUlISXn75Zc38pKQkDBgwoFb2OXJ+Bv77b3+sm9UE8nxbuHmX44XhORgYo92yP7qrAQQBCBtQ9by5MSTvcoOzmwrD370Fdy8lMi/Y48MRgci9IU4hYCbdBbcvxcf/d0nzekLs/ZsI7fvWHZ9MCRAlkykeJ2ZiJjGohfuTIeubIlGfR/7NN9/gtddeQ0JCAkJDQ7FmzRqsXbsW6enpaNy48VPX5/PIqcbxeeRERmXM55EfS/dBPQNqxd1iNbq2zjG555GLOjph8ODBuH37NubNm4fs7Gy0adMGP/30k05FnIiIiEzgXuvR0dGIjo4WOwYREdVxlYPWDFnfFIleyImIiIxBLUigFqpfjA1ZtzaZzollIiIi0htb5EREZBHYtU5ERGTGVLCCyoCOaFO9foSFnIiILIJg4DlygefIiYiIqKaxRU5ERBaB58iJiIjMmEqwgkow4By5id6ilV3rREREZowtciIisghqSKA2oP2qhmk2yVnIiYjIIvAcuQkb27IbbCS2YsfQ2Hb9qNgRqnjF3wSfyGaKT/UyxUxkvkzxaXqmRlADarFDmDeeIyciIotQOdjNkEkfSqUSH374IQIDA+Hg4IAmTZpg3rx5UKv//uYiCAJiY2Ph6+sLBwcHREREID09Xa/9sJATEZFFuH+O3LBJH4sXL0ZCQgJWrVqF8+fPY8mSJfj444+xcuVKzTJLlizB0qVLsWrVKqSkpMDHxwe9e/dGcXGxzvupE13rRERExiKXy7VeS6VSSKXSKssdOXIEAwYMQN++fQEAAQEB2LJlC1JTUwHcb40vW7YMs2bNwsCBAwEAiYmJ8Pb2xubNmzF+/Hid8rBFTkREFkH9173WqztVjniXyWRwdXXVTPHx8Y/c33PPPYdffvkFFy9eBAD8/vvvOHjwIPr06QMAyMjIQE5ODiIjIzXrSKVShIeH4/Dhwzr/XGyRExGRRTD8hjD3Lz/LysqCi4uLZv6jWuMAMH36dBQVFaFFixawtraGSqXCwoULMXToUABATk4OAMDb21trPW9vb2RmZuqci4WciIgsgvqBVnX11r9fyF1cXLQK+eN888032LRpEzZv3ozWrVvj1KlTiImJga+vL0aOHKlZTiLRPvcuCEKVeU/CQk5ERFQLpk6dig8++ABDhgwBALRt2xaZmZmIj4/HyJEj4ePjA+B+y7xhw4aa9XJzc6u00p+E58iJiMgiqASJwZM+SktLYWWlXWatra01l58FBgbCx8cHSUlJmvfLy8uRnJyMsLAwnffDFjkREVmEykFr1V9fv1u09u/fHwsXLoS/vz9at26NkydPYunSpRg9ejSA+13qMTExiIuLQ1BQEIKCghAXFwdHR0cMGzZM5/2wkBMREdWClStXYvbs2YiOjkZubi58fX0xfvx4fPTRR5plpk2bhrKyMkRHR6OgoABdu3bFvn374OzsrPN+JIIgmOZd4HUgl8vh6uqKCAzgLVqfgrdoJRIBb9H6VEqhAvvV21FUVKTTALLqqKwVX53oCEfn6n8mpcUqjO50slazVgdb5EREZBGM3bVuLCzkAPqNzMegiXlw96pA5kV7JHzki7PH6xll3yol8M3SRvjfjgYozLVDfe9yPD8oD/+afAOVYyTKSqywKc4fx/e64W6BLTxlCvQZnYN/vH7LKBkBoE3XYgyacAtBbcvg4VOB2DFNcGRvfaPt/3HE/OyYiZlqkyn+mzPFTMRR6wj/ZwEmzL2JLSu8EB0ZjLPHnLDg6wx4+pUbZf87PvPFvo3eGLvgKpbv/x2vz7yG7xJ88dNXPppl1sc2xqn99TF5xZ9Yvv939BubjS9nB+D4XjejZAQAe0c1rpxzxKezGxltn08j9mfHTMxUm0zx35wpZtKHGoaNXDfVh7SJWsgPHDiA/v37w9fXFxKJBDt37jR6hoHj8rF3izv2bPZA1mV7JMzxQ95NW/R7/bZR9n8xzRldIgvQuWchvGQKhPa7g/Y9CvHnaSfNMhdOOCNiUB7ahMnhJVMgckQuAlqVaC1T21J/c0Xix744tNt4Xx6eRuzPjpmYqTaZ4r85U8ykj8obwhgymSJRU5WUlKB9+/ZYtWqVKPu3sVUjqF0p0pK1RwemJTujVUiJUTK06FKMM4dccfOKPQDg6jlH/JHijE4vFGqWadmlGClJbridbQtBAM4ccsHNKw7oEF5klIymyBQ+O2ZiJiJTIOo58qioKERFRYm2fxd3FaxtgMJ87cNQmGcDNy+lUTK8POkmSout8U54e1hZC1CrJBg2PQvdX/q7FTB63lUkTGuCcV06w9pGDYkVMHHJFbR8RvfH3NU1pvDZMRMzkXkx/F7rptkiN6vBbgqFAgqFQvP64UfJVdfDF+BJJICxBice2uWBA9sbIGbVZciCS5GR7oR1sY3h5l2O5wflAwB++soHF0/Uwwfr/oCnXznOHXPG2lmBcPMuR/vuNXMMzJWYn93jMJNumImMrTrPFH94fVNkVoU8Pj4ec+fOrbHtye9YQ6UE3Dy1v3G7NlCiIM84h2bDAn+8POkmnhtwvwXeuGUZ8m9IsX2VH54flA9FmQSbF8sw7YuL6NyzEAAQ0KoUV9OdsCvB12ILuSl8dszETGRe6mqL3DRTPcaMGTNQVFSkmbKysgzanrLCCpdOO6JTD+0u6k49inEu1TgDyRRlVpA89ClYWQsQ/hoeqVJaQVlhhYcfhGNlLVRpPVgSU/jsmImZiEyBWX3VlEqlj33ua3VtX9MAU1dk4eJpB5xPdUKfEbfh5VeBHzd41Oh+HiekdyG2rfCFp58CsuAyZJx1xPdrGuKFwXkAAEdnFVp3k2PDQn/Y2avh2UiB9KMuSP6vJ0bO0f15tYayd1TBN+Dv0xo+MgWatCpFcaEN8m7aGS3Hg8T+7JiJmWqTKf6bM8VM+jD8hjCm2fY1q0JeG5J3ucHZTYXh796Cu5cSmRfs8eGIQOTeMM4v5dj5GdjysQxrZgZCnm8LN59y9B5xC4NibmiWefezS/h6kQzL326Gu4U2aNBIgaHTr+HF14x3Q5jg9qX4+P8uaV5PiL2fb9+37vhkSoDRcjxI7M+OmZipNpnivzlTzKQPtSCBWs8nmD28vikS9V7rd+/exeXLlwEAHTt2xNKlS/H888/D3d0d/v7+T12f91rXHe+1TiQC3mv9qYx5r/UlKd3hUK/67deyu0pM6/I/3mv9QampqXj++ec1r6dMmQIAGDlyJNavXy9SKiIiqovUBnatm+oNYUQt5BERETDjh68REZEZUQtWUBsw8tyQdWuTaaYiIiIinVj8YDciIrIMKkigMuCmLoasW5tYyImIyCKwa52IiIhMDlvkRERkEVQwrHvcVC+YZSEnIiKLUFe71lnIiYjIIvChKURERGRy2CInIiKLIBj4PHKBl58RERGJh13rREREZHLYIq8FrzTqJnaEKj7LTBY7QhXRgeFiR6iKT2SjmsTfp6cTjHeM6upjTFnIiYjIIqgMfPqZIevWJtNMRURERDphi5yIiCwCu9aJiIjMmBpWUBvQEW3IurXJNFMRERGZuYCAAEgkkirTpEmTAACCICA2Nha+vr5wcHBAREQE0tPT9d4PCzkREVkElSAxeNJHSkoKsrOzNVNSUhIAYNCgQQCAJUuWYOnSpVi1ahVSUlLg4+OD3r17o7i4WK/9sGudiIgsQk2dI5fL5VrzpVIppFJpleU9PT21Xi9atAhNmzZFeHg4BEHAsmXLMGvWLAwcOBAAkJiYCG9vb2zevBnjx4/XORdb5EREZBGEv55+Vt1J+OvObjKZDK6urpopPj7+qfsuLy/Hpk2bMHr0aEgkEmRkZCAnJweRkZGaZaRSKcLDw3H48GG9fi62yImIiPSQlZUFFxcXzetHtcYftnPnThQWFmLUqFEAgJycHACAt7e31nLe3t7IzMzUKw8LORERWQQVJFAZ8OCTynVdXFy0CrkuvvzyS0RFRcHX11drvkSinUcQhCrznoaFnIiILIJaMOxacLVQvfUyMzPx888/Y/v27Zp5Pj4+AO63zBs2bKiZn5ubW6WV/jQ8R05ERFSL1q1bBy8vL/Tt21czLzAwED4+PpqR7MD98+jJyckICwvTa/tskQPoNzIfgybmwd2rApkX7ZHwkS/OHq9nsZlUSuDH//gjZacX5Hm2cPGqQOigW/jH21mw+uur34b3gnD0v9rfGgM6yjFt52mjZASANl2LMWjCLQS1LYOHTwVixzTBkb31jbb/x+HvEzMxk2mqHLRmyPp6r6NWY926dRg5ciRsbP4uuRKJBDExMYiLi0NQUBCCgoIQFxcHR0dHDBs2TK99WHyLPPyfBZgw9ya2rPBCdGQwzh5zwoKvM+DpV26xmfatboT/fd0Qr877Ex/9cgIvz8hA0ud+2L9e+9xOq/A7iE85ppkmrT9nlHyV7B3VuHLOEZ/ObmTU/T6J2J8dMzGTJWbSlRoSgyd9/fzzz7h27RpGjx5d5b1p06YhJiYG0dHRCAkJwY0bN7Bv3z44OzvrtQ9RC3l8fDy6dOkCZ2dneHl54aWXXsKFCxeMmmHguHzs3eKOPZs9kHXZHglz/JB30xb9Xr9t1BymlCnjhAva9b6Ntj0L4CFToFPf22jZvRDXTmt/47aRCnD1qtBMTvWVRslXKfU3VyR+7ItDu92Mut8nEfuzYyZmssRMpiwyMhKCICA4OLjKexKJBLGxscjOzsa9e/eQnJyMNm3a6L0PUQt5cnIyJk2ahKNHjyIpKQlKpRKRkZEoKSkxyv5tbNUIaleKtGTtbz9pyc5oFWKcDKaYqWkXOS4cro9bV+wBANfPOeHPVBe0fv6O1nKXjrpiWqdnEBvRGV9Pb4bifFuj5DNVpvDZMRMzWVomfRj7zm7GIuo58j179mi9rhwQkJaWhh49etT6/l3cVbC2AQrztQ9DYZ4N3LyM27o0pUyRE6+jrNga817oDIm1AEElQf+pmegyIF+zTKuIAnTskw+PRgrkZ9njh0/8sWxoG3zwwynYSqs5tNPMmcJnx0zMZGmZ9CHGOXJjMKnBbkVFRQAAd3f3R76vUCigUCg0rx++TV51CQ/VHYkEgMi1SMxMad83wPEdXnhjxQU0DC7F9XNO+O/cJqjvXY5u/8oFAIT0/7uo+zYvReO2xfjw2S44+6s7OkZZdhcbf590w0y6YSZ6GpMp5IIgYMqUKXjuuecee44gPj4ec+fOrbF9yu9YQ6UE3Dy1v0m6NlCiIE+cQ2MKmbbHBeLFidcR8s/7xdqvRSnuXLfH3s8aaQr5w1y9K+Dup0DeVXujZDRFpvDZMRMzWVomfahh4L3WDbiZTG0ymX6Ct956C6dPn8aWLVseu8yMGTNQVFSkmbKysgzap7LCCpdOO6JTD+0nzXTqUYxzqU4GbducM1WUWUFipf31WmItQFA//pf4boENCrKlcPGqqO14JssUPjtmYiZLy6QPwcAR64KJFnKT+Ar19ttvY9euXThw4AAaNXr8pUSPe8KMIbavaYCpK7Jw8bQDzqc6oc+I2/Dyq8CPGzxqdD/mlKltrzvYs0oGN18FfINLkZVeD79+4YfQV28BAO6VWOHH//ijY9RtuHqV4/Z1e3y3pDHquVWgw4vG61a3d1TBN+DvUy0+MgWatCpFcaEN8m7aGS3Hg8T+7JiJmSwxk65q6ulnpkbUQi4IAt5++23s2LED+/fvR2BgoNEzJO9yg7ObCsPfvQV3LyUyL9jjwxGByL0hTiEwhUyvzr2C7z/xxzezm6I43xau3uV4blg2+ky+3wNiZQ3cvOCEY9u9UCa3gatXOYJDizDm0z9gX09llIwAENy+FB//3yXN6wmxNwAA+751xydTAoyW40Fif3bMxEyWmMnSSQTh4WELxhMdHY3Nmzfju+++Q/PmzTXzXV1d4eDg8NT15XI5XF1dEYEBsJFY9qVPT/NZ5kGxI1QRHRgudoSq1Mb7IkJEgFKowH58h6KiIr0fRKKrylrxctIbsHWq/heOipJy7Oi9rlazVoeoLfLVq1cDACIiIrTmr1u3TvOoNyIioprArvVaIGJnABERUZ1gEoPdiIiIalt175f+4PqmiIWciIgsQl3tWjeZ68iJiIhIf2yRExGRRairLXIWciIisgh1tZCza52IiMiMsUVOREQWoa62yFnIiYjIIggw7BIyU73zCQs5ERFZhLraIuc5ciIiIjPGFjkREVmEutoiZyG3ENGNnxM7QhUTL10QO0IVq4OaiR2hCisnJ7EjVKEuKRE7QhXW9V3FjlCVjen9iVXl3xY7gmjqaiFn1zoREZEZM72vi0RERLWgrrbIWciJiMgiCIIEggHF2JB1axO71omIiMwYW+RERGQR+DxyIiIiM1ZXz5Gza52IiMiMsUVOREQWgYPdiIiIzFhl17ohk75u3LiBESNGwMPDA46OjujQoQPS0tI07wuCgNjYWPj6+sLBwQERERFIT0/Xax8s5EREZBEqW+SGTPooKCjAs88+C1tbW+zevRvnzp3DJ598gvr162uWWbJkCZYuXYpVq1YhJSUFPj4+6N27N4qLi3XeD7vWiYiI9CCXy7VeS6VSSKXSKsstXrwYMpkM69at08wLCAjQ/L8gCFi2bBlmzZqFgQMHAgASExPh7e2NzZs3Y/z48TrlYYuciIgsgmBgt3pli1wmk8HV1VUzxcfHP3J/u3btQkhICAYNGgQvLy907NgRa9eu1byfkZGBnJwcREZGauZJpVKEh4fj8OHDOv9cbJED6DcyH4Mm5sHdqwKZF+2R8JEvzh6vx0wmlGlTRGMU37CtMr/18EL0iM1Hab41ji7xQNYhR5TLrdCwSxme+ygf9QMqjJLvQab02fUdloO+Q3Pg3UgBAMi85IDNq2RIPeAmSp4HmdJxetirb17DqHevYucGP6xZ1FSUDMMnXsHwiVe15t3Jt8OIF8R/AJIpf3ZPIgAQBMPWB4CsrCy4uLho5j+qNQ4AV65cwerVqzFlyhTMnDkTx48fxzvvvAOpVIrXX38dOTk5AABvb2+t9by9vZGZmalzLosv5OH/LMCEuTexaqYf0o87oe9rt7Hg6wy8GdEceTfsmMlEMr2yLQuC+u/zU3cu2uH7UX5oGlUCQQD2TGwIKxsBUauzYVtPjdNf1cf3I30xZPc12Doa8C9XT2Ifp4fl59hh3b8b42amPQCg18u5+Gj1H3hrQHtcu+xo9DyVTO04PSioTTH+MSgbV/4Q/6lzVy87YdabHTSvVWrxR02b8mdnLC4uLlqF/HHUajVCQkIQFxcHAOjYsSPS09OxevVqvP7665rlJBLtz1UQhCrznkTUrvXVq1ejXbt2moMSGhqK3bt3GzXDwHH52LvFHXs2eyDrsj0S5vgh76Yt+r0u3qP+mKkqBw81HD1Vmunqb05w8S+H7zNlKLpqi1un7NFjXh682ing1qQC3efmoaLUCpd+cDZKvkpiH6eHHfvVHSnJbrhx1QE3rjog8T+Nca/UGi066D6QpjaY2nGqZO+owrQlf2DFnGDclYvfzlEpJSi4LdVM8gLxC6Wpfna6qLyzmyGTPho2bIhWrVppzWvZsiWuXbsGAPDx8QEATcu8Um5ubpVW+pOIWsgbNWqERYsWITU1FampqXjhhRcwYMAAvYfeV5eNrRpB7UqRlqz9xz4t2RmtQsR53jIzPZ2qHLi0yxkt/lUMiQRQld//x2Vtp9YsY2UNWNsKyEm1N1ouUztOD7OyEhDeNx/2jir8ccq4X3AeZMrHKfrDSzie7I5TR8Q/9QAAfo1LsfHng/hq92FMX3wWPn5louYx5c9OF8Yetf7ss8/iwoULWvMuXryIxo0bAwACAwPh4+ODpKQkzfvl5eVITk5GWFiYzvsR9Stn//79tV4vXLgQq1evxtGjR9G6desqyysUCigUCs3rh0cO6svFXQVrG6AwX/swFObZwM1LadC2man2ZPxcDwq5FVoMvP/5129SDme/Chz7xAPh8/Ng46DG7+vqozTPBqV5xvsVN7XjVCkguARLvz0DO6kaZaXWmB/dQtRudVM9Tj2ictGs1V1MfrWTaBkedOGMKz6Z1Qo3Mh1R370cQ8Zdxb83pmHiy11RXFR1vIgxmOpnZ6reffddhIWFIS4uDq+++iqOHz+ONWvWYM2aNQDud6nHxMQgLi4OQUFBCAoKQlxcHBwdHTFs2DCd9yN+39FfVCoV/u///g8lJSUIDQ195DLx8fGYO3duje/74cEPEgn+HtUgEmZ6vD/+zwX+PUrh5K0CAFjbAi+uysFvM7zwVUgTSKwFNAorhX+4OC0EUzlOla5nOGDSP9ujnosKz754G+8tuYRpw9uIWswB0zpODXzuYfyMP/Hhm21RUW4aF/OkHvTQen3+tCu+/PEIev0zGzs2+ouU6j5T+uz0oRYkkBjxXutdunTBjh07MGPGDMybNw+BgYFYtmwZhg8frllm2rRpKCsrQ3R0NAoKCtC1a1fs27cPzs6695qJXsjPnDmD0NBQ3Lt3D/Xq1cOOHTuqnFOoNGPGDEyZMkXzWi6XQyaTVXvf8jvWUCkBN0/tb5KuDZQoMGJLjpl0V3zDBtcPO+DFT7XPKXm2UeDV77OgKLaCuvz+OfVtrzSCZ9t7RstmSsfpQcoKK2RfcwAAXDpbD8Ft72LAyGysnC3OaGxTPE5Bre/CrUEFVvzfCc08axugTUgR+g+7gQEdukMt8kAzRZk1Mi85wbexeN3rpvjZ6UMQDBy1Xo11+/Xrh379+j32fYlEgtjYWMTGxlY7l+hfPZs3b45Tp07h6NGjmDhxIkaOHIlz5849clmpVKoZGKfrqMEnUVZY4dJpR3TqoT3wp1OPYpxLFWfEKjM92R/bXODgoULjiEe3tqXOajh4qFF41RZ5Z6UI7Gm8VrkpHacnkUgA2wfGExibKR6nU0fqY+I/O+OtgX9PF8/Uw/4fvPDWwM6iF3Hg/vlpWZNS3MkTb8CbKX52ZAItcjs7OzRr1gwAEBISgpSUFCxfvhyff/65Ufa/fU0DTF2RhYunHXA+1Ql9RtyGl18Fftzg8fSVmcmomQQ18Mc2ZzR/uRhWD/3m/rnbCfbuajg3rMDti1IcWtAAAb1KIOtu3NaLKRynB42ckonUA27Iy7aDo5MK4X3z0bZrEWaPeXSvl7GY2nEqK7VB5mXtX6p7ZdaQF9oi87I4BWrMe5dwbH8D5OXYa86ROzop8csuH1HyVDK1z04fdfWhKaIX8ocJgqA1oK22Je9yg7ObCsPfvQV3LyUyL9jjwxGByBXxekhmerTrhxxw96YtWvyr6iDHklwbHIqrj7LbNnD0VKL5S8XoPOmO0bJVMoXj9CC3BhWY+vEluHuVo6TYGhl/OGH2mFY4eai+KHkqmdpxMkUNvBSYvjgdLm4VKLpjiwtnXPHuiBDkZjuImsucP7u6WsglgmDIGQPDzJw5E1FRUZDJZCguLsbWrVuxaNEi7NmzB717937q+nK5HK6urojAANhIxBnFSdU38dJlsSNUsTqomdgRqrByMr0uS3WJ6V1qZF3fVewIVdmYXFsJqnzTut5bKVRgP75DUVGRwadLH6eyVjTf/AGsHR99FzZdqEoVuDBsUa1mrQ5Rf8tu3bqF1157DdnZ2XB1dUW7du10LuJEREQkciH/8ssvxdw9ERFZEDFGrRuD6fX7EBER1YL7hdyQc+Q1GKYGiX75GREREVUfW+RERGQR6uqodRZyIiKyCAIMu5Osifass2udiIjInLFFTkREFoFd60REROasjvats5ATEZFlMLBFDhNtkfMcORERkRlji5yIiCwC7+xGRERkxjjYjaiGmeKTxrZdPyp2hCpeadRN7AhmQVVYJHYEs2BqT4kThHKgUOwU5o2FnIiILIMgMWzAGlvkRERE4qmr58g5ap2IiMiMsUVORESWgTeEISIiMl8WPWp9xYoVOm/wnXfeqXYYIiIi0o9Ohfw///mPThuTSCQs5EREZLpMtHvcEDoV8oyMjNrOQUREVKvqatd6tUetl5eX48KFC1AqlTWZh4iIqHYINTCZIL0LeWlpKcaMGQNHR0e0bt0a165dA3D/3PiiRYtqPCARERE9nt6FfMaMGfj999+xf/9+2Nvba+b36tUL33zzTY2GIyIiqjmSGphMj96Xn+3cuRPffPMNunXrBonk7x+qVatW+PPPP2s0HBERUY2po9eR690iz8vLg5eXV5X5JSUlWoXdnPQbmY/Eo+fx/ZXTWLXnIto8c1fsSMxkBplUSmDzkkaYGNoBQ5s+g4lhHfDtf/ygVv+9TFmJFdbOCsCbIR0xtOkzeCeiPfZs8DZaxkr87JipNrz65jX8dO4Axn3ARtyjxMbGQiKRaE0+Pj6a9wVBQGxsLHx9feHg4ICIiAikp6frvR+9C3mXLl3w448/al5XFu+1a9ciNDRU7wBiC/9nASbMvYktK7wQHRmMs8ecsODrDHj6lTMTMz3Rjs98sW+jN8YuuIrl+3/H6zOv4bsEX/z01d//UNfHNsap/fUxecWfWL7/d/Qbm40vZwfg+F43o2QExD9OzFS3MlUKalOMfwzKxpU/nMSOojsRBru1bt0a2dnZmunMmTOa95YsWYKlS5di1apVSElJgY+PD3r37o3i4mK99qF3IY+Pj8esWbMwceJEKJVKLF++HL1798b69euxcOFCfTentV2JRIKYmJhqb6M6Bo7Lx94t7tiz2QNZl+2RMMcPeTdt0e/120bNwUzml+limjO6RBagc89CeMkUCO13B+17FOLP03//YbtwwhkRg/LQJkwOL5kCkSNyEdCqRGuZ2ib2cWKmupUJAOwdVZi25A+smBOMu3IzukFo5dPPDJkAyOVyrUmhUDx2lzY2NvDx8dFMnp6e96MIApYtW4ZZs2Zh4MCBaNOmDRITE1FaWorNmzfr9WPpXcjDwsJw6NAhlJaWomnTpti3bx+8vb1x5MgRdO7cWd/NAQBSUlKwZs0atGvXrlrrV5eNrRpB7UqRluysNT8t2RmtQkqMmoWZzC9Tiy7FOHPIFTev3B/0efWcI/5IcUanFwo1y7TsUoyUJDfczraFIABnDrng5hUHdAg3zrOzTeE4MVPdyVQp+sNLOJ7sjlNHjNezZEpkMhlcXV01U3x8/GOXvXTpEnx9fREYGIghQ4bgypUrAO7fnyUnJweRkZGaZaVSKcLDw3H48GG98lTrq1Tbtm2RmJhYnVWruHv3LoYPH461a9diwYIFT1xWoVBoffORy+UG7dvFXQVrG6AwX/swFObZwM1LnOvjmcl8Mr086SZKi63xTnh7WFkLUKskGDY9C91f+ru1NHreVSRMa4JxXTrD2kYNiRUwcckVtHxGv66z6jKF48RMdScTAPSIykWzVncx+dVOomWorpp6jGlWVhZcXFw086VS6SOX79q1KzZs2IDg4GDcunULCxYsQFhYGNLT05GTkwMA8PbWHjPj7e2NzMxMvXJVq5CrVCrs2LED58+fh0QiQcuWLTFgwADY2Oi/uUmTJqFv377o1avXUwt5fHw85s6dW53IT/TwByuRQPTRicykGzEzHdrlgQPbGyBm1WXIgkuRke6EdbGN4eZdjucH5QMAfvrKBxdP1MMH6/6Ap185zh1zxtpZgXDzLkf77oZ9EdUHPzvdMNOTNfC5h/Ez/sSHb7ZFRbkZPgW7hkatu7i4aBXyx4mKitL8f9u2bREaGoqmTZsiMTER3bp1A4Aqg8QFQdB74Ljelffs2bMYMGAAcnJy0Lx5cwDAxYsX4enpiV27dqFt27Y6b2vr1q04ceIEUlJSdFp+xowZmDJliua1XC6HTCbT7wd4gPyONVRKwM1T+9utawMlCvLEOe/DTOaTacMCf7w86SaeG3C/Bd64ZRnyb0ixfZUfnh+UD0WZBJsXyzDti4vo3LMQABDQqhRX052wK8HXKIXcFI4TM9WdTEGt78KtQQVW/N8JzTxrG6BNSBH6D7uBAR26Q602z6uXjMHJyQlt27bFpUuX8NJLLwEAcnJy0LBhQ80yubm5VVrpT6P3V6qxY8eidevWuH79Ok6cOIETJ04gKysL7dq1w7hx43TeTlZWFiZPnoxNmzZp3VjmSaRSqeabkK7fiJ5EWWGFS6cd0amHdjdnpx7FOJcqzkhMZjKfTIoyK0ge+hdkZS1A+OvyM5XSCsoKKzz85drKWjCoe08fpnCcmKnuZDp1pD4m/rMz3hr493TxTD3s/8ELbw3sbPpFvIYGu1WXQqHA+fPn0bBhQwQGBsLHxwdJSUma98vLy5GcnIywsDC9tqv317rff/8dqampcHP7e5CDm5sbFi5ciC5duui8nbS0NOTm5moNkFOpVDhw4ABWrVoFhUIBa2trfePpbfuaBpi6IgsXTzvgfKoT+oy4DS+/Cvy4waPW981M5p0ppHchtq3whaefArLgMmScdcT3axrihcF5AABHZxVad5Njw0J/2Nmr4dlIgfSjLkj+rydGztHvHJghxD5OzFR3MpWV2iDzsnbZuFdmDXmhLTIvm/5laBLh/mTI+vp4//330b9/f/j7+yM3NxcLFiyAXC7HyJEjNVdpxcXFISgoCEFBQYiLi4OjoyOGDRum1370LuTNmzfHrVu30Lp1a635ubm5aNasmc7b6dmzp9b1dADwxhtvoEWLFpg+fbpRijgAJO9yg7ObCsPfvQV3LyUyL9jjwxGByL1hZ5T9M5P5Zho7PwNbPpZhzcxAyPNt4eZTjt4jbmFQzA3NMu9+dglfL5Jh+dvNcLfQBg0aKTB0+jW8+Noto2QExD9OzFS3Mpk1I9/Z7fr16xg6dCjy8/Ph6emJbt264ejRo2jcuDEAYNq0aSgrK0N0dDQKCgrQtWtX7Nu3D87Ozk/ZsjaJIDy9k+/B0eEHDx7EtGnTEBsbqzlZf/ToUcybNw+LFi1Cnz599ArwoIiICHTo0AHLli3TaXm5XA5XV1dEYABsJLbV3i9RpW3Xj4odoYpXGnUTOwLVIdb1XcWOoEUplOOXwo0oKioy+HTp41TWCtmyebBy0O1U7qOoy+4hK+ajWs1aHTq1yOvXr681ik4QBLz66quaeZXfBfr37w+VSlULMYmIiAxk6HluE30euU6F/LfffqvtHACA/fv3G2U/RERkgeroQ1N0KuTh4eG1nYOIiIiqodoXI5aWluLatWsoL9e+eb+xb7NKRESkE0tukT8oLy8Pb7zxBnbv3v3I93mOnIiITFIdLeR63xAmJiYGBQUFOHr0KBwcHLBnzx4kJiYiKCgIu3btqo2MRERE9Bh6t8h//fVXfPfdd+jSpQusrKzQuHFj9O7dGy4uLoiPj0ffvn1rIycREZFh6uiodb1b5CUlJfDy8gIAuLu7Iy/v/l2s2rZtixMnTjxpVSIiItFU3tnNkMkU6V3ImzdvjgsXLgAAOnTogM8//xw3btxAQkKC1o3fiYiIqPbp3bUeExOD7OxsAMCcOXPw4osv4uuvv4adnR3Wr19f0/mIiIhqRh0d7KZ3IR8+fLjm/zt27IirV6/ijz/+gL+/Pxo0aFCj4YiIiOjJDH6oraOjIzp16lQTWYiIiGqNBAY+/azGktQsnQr5lClTdN7g0qVLqx2GiIiI9KNTIT958qROG3vwwSpE5sgUnzRmkk9k839W7AhVqXkzKl2oy+6JHUGLWqgw3s7q6OVnJvXQFCIiolpTRwe76X35GREREZkOgwe7ERERmYU62iJnISciIotg6N3Z6syd3YiIiMh0sEVORESWoY52rVerRb5x40Y8++yz8PX1RWZmJgBg2bJl+O6772o0HBERUY0RamAyQXoX8tWrV2PKlCno06cPCgsLoVLdv3azfv36WLZsWU3nIyIioifQu5CvXLkSa9euxaxZs2Btba2ZHxISgjNnztRoOCIioppSVx9jqvc58oyMDHTs2LHKfKlUipKSkhoJRUREVOPq6J3d9G6RBwYG4tSpU1Xm7969G61ataqJTERERDWvjp4j17tFPnXqVEyaNAn37t2DIAg4fvw4tmzZgvj4eHzxxRe1kZGIiIgeQ+9C/sYbb0CpVGLatGkoLS3FsGHD4Ofnh+XLl2PIkCG1kbHW9RuZj0ET8+DuVYHMi/ZI+MgXZ4/XYyZmMrtMKiXwzdJG+N+OBijMtUN973I8PygP/5p8A1Z/9b+VlVhhU5w/ju91w90CW3jKFOgzOgf/eP2WUTICQJuuxRg04RaC2pbBw6cCsWOa4Mje+kbb/+Pw9+nJBk+8iWdfLECjpmUov2eFcyfq4avFMly/4iBKHn3xhjAPePPNN5GZmYnc3Fzk5OQgKysLY8aMqelsRhH+zwJMmHsTW1Z4IToyGGePOWHB1xnw9CtnJmYyu0w7PvPFvo3eGLvgKpbv/x2vz7yG7xJ88dNXPppl1sc2xqn99TF5xZ9Yvv939BubjS9nB+D4XjejZAQAe0c1rpxzxKezGxltn08j9mdnDpnadi3G9xu98O7AVpjxegtYWwtYuOECpA5m8uS5Otq1btCd3Ro0aAAvL69qrx8bGwuJRKI1+fj4PH3FGjRwXD72bnHHns0eyLpsj4Q5fsi7aYt+r982ag5mYqaacDHNGV0iC9C5ZyG8ZAqE9ruD9j0K8edpJ80yF044I2JQHtqEyeElUyByRC4CWpVoLVPbUn9zReLHvji023hfHp5G7M/OHDJ9OKo5krZ5IvOSIzLOO2LptCbw9itHUFsOdBZTtQa7NWnS5LGTvlq3bo3s7GzNZMxL2Gxs1QhqV4q0ZGet+WnJzmgVIs4vJjMxkyFadCnGmUOuuHnFHgBw9Zwj/khxRqcXCjXLtOxSjJQkN9zOtoUgAGcOueDmFQd0CC8ySkZTZAqfnTlkepij8/2WeHGhmdwk1NBLz0y0Ra730Y+JidF6XVFRgZMnT2LPnj2YOnWq/gFsbHRuhSsUCigUCs1ruVyu9/4e5OKugrUNUJivfRgK82zg5qU0aNvMxExiZHp50k2UFlvjnfD2sLIWoFZJMGx6Frq/9HcLbvS8q0iY1gTjunSGtY0aEitg4pIraPlMsVEymiJT+OzMIZM2AeM/vIazKfWQedFR7DC6EfEWrfHx8Zg5cyYmT56suXmaIAiYO3cu1qxZg4KCAnTt2hWffvopWrdurde29S7kkydPfuT8Tz/9FKmpqfpuDpcuXYKvry+kUim6du2KuLi4x7bs4+PjMXfuXL338TTCQx+ORALRv3kxk26YSduhXR44sL0BYlZdhiy4FBnpTlgX2xhu3uV4flA+AOCnr3xw8UQ9fLDuD3j6lePcMWesnRUIN+9ytO9u2Jdjc8ffJ91NmpeJwBaleG8QLzt+mpSUFKxZswbt2rXTmr9kyRIsXboU69evR3BwMBYsWIDevXvjwoULcHZ2fszWqqqxp59FRUVh27Zteq3TtWtXbNiwAXv37sXatWuRk5ODsLAw3L796PM/M2bMQFFRkWbKysoyKLP8jjVUSsDNU/vbrWsDJQryxOkqYiZmMsSGBf54edJNPDfgNhq3LEPEv/LR/80cbF/lBwBQlEmwebEMo+ZkokvvQgS0KkWfN27h2f63sSvB1ygZTZEpfHbmkKnSxNir6NazENOGtkR+jp2oWfRSQ4Pd5HK51vRgT/HD7t69i+HDh2Pt2rVwc/t7TIggCFi2bBlmzZqFgQMHok2bNkhMTERpaSk2b96s149VY4X8v//9L9zd3fVaJyoqCq+88gratm2LXr164ccffwQAJCYmPnJ5qVQKFxcXrckQygorXDrtiE49tLsUO/UoxrlU4w38YSZmqimKMitIHvpXbWUtQFDf/3+V0grKCqv7rbqHlzGBVp5YTOGzM4dMgIDouVfx7IsFmD68BW5dl4qUo3pq6hatMpkMrq6umik+Pv6x+5w0aRL69u2LXr16ac3PyMhATk4OIiMjNfOkUinCw8Nx+PBhvX4uvb/WdezYEZIH/goIgoCcnBzk5eXhs88+03dzWpycnNC2bVtcunTJoO3oY/uaBpi6IgsXTzvgfKoT+oy4DS+/Cvy4wcNoGZiJmWpKSO9CbFvhC08/BWTBZcg464jv1zTEC4PzANwfnNS6mxwbFvrDzl4Nz0YKpB91QfJ/PTFyTqZRMgKAvaMKvgF/t2J8ZAo0aVWK4kIb5N0Up4Un9mdnDpkmzcvE8wNuY+64IJTdtYJbg/uXwZUU26BcUWPtQpOXlZWl1ZCUSh/9hWbr1q04ceIEUlJSqryXk5MDAPD29taa7+3trXmqqK70LuQvvfSS1msrKyt4enoiIiICLVq00HdzWhQKBc6fP4/u3bsbtB19JO9yg7ObCsPfvQV3LyUyL9jjwxGByL0hXncRMzFTdY2dn4EtH8uwZmYg5Pm2cPMpR+8RtzAo5oZmmXc/u4SvF8mw/O1muFtogwaNFBg6/RpefM14N4QJbl+Kj//v7y/sE2Lv59v3rTs+mRJgtBwPEvuzM4dM/V/LBQB8vPUPrfmfvB+IpG2eYkQShS49wllZWZg8eTL27dsHe3v7xy4neah7TBCEKvOeRiIIuneoKZVKfP3113jxxRdr5Hrv999/H/3794e/vz9yc3OxYMECJCcn48yZM2jcuPFT15fL5XB1dUUEBsBGYmtwHiJTtO36UbEjVPGK/7NiR6hKbSY3JRGZ5DGtR7EohQr8pvgWRUVFBp8ufZzKWtF0Rhysn1BUn0Z17x7+jJ+pU9adO3fi5Zdf1npKqEqlgkQigZWVFS5cuIBmzZrhxIkTWg8iGzBgAOrXr//YU8yPoldfiI2NDSZOnPjEE/v6uH79OoYOHYrmzZtj4MCBsLOzw9GjR3Uq4kRERPow5mNMe/bsiTNnzuDUqVOaKSQkBMOHD8epU6fQpEkT+Pj4ICkpSbNOeXk5kpOTERYWptfPpXfXeteuXXHy5MkaKbZbt241eBtERESmxtnZGW3atNGa5+TkBA8PD838mJgYxMXFISgoCEFBQYiLi4OjoyOGDRum1770LuTR0dF47733cP36dXTu3BlOTtqjJx++To6IiMhkmNDVGdOmTUNZWRmio6M1N4TZt2+fXteQA3oU8tGjR2PZsmUYPHgwAOCdd97RvCeRSDQn6FUqnqciIiITJOKd3QBg//79Wq8lEgliY2MRGxtr0HZ1LuSJiYlYtGgRMjIyDNohERER1RydC3nl4HYORCMiInNUV59Hrtc5cn2vbSMiIjIZInet1xa9CnlwcPBTi/mdO3cMCkRERES606uQz507F66urrWVhYiIqNawax3AkCFD4OXlVVtZiIiIak8d7VrX+c5uPD9ORERkevQetU5ERGSW6miLXOdCrlarazMHERFRreI5ctKdlfXTlzE2PhnKbL3SqJvYEarYezNN7AhVvOjbQewIZkGooYde1RRBqDDizlAnW+SW8yR4IiKiOogtciIisgx1tEXOQk5ERBahrp4jZ9c6ERGRGWOLnIiILAO71omIiMwXu9aJiIjI5LBFTkREloFd60RERGasjhZydq0TERGZMbbIiYjIIkj+mgxZ3xSxkBMRkWVg13rd1W9kPhKPnsf3V05j1Z6LaPPMXVHztOlajLnrLmNz6hnsvX4CoS8WipqnkqkdJ2Yyj0yld62w+iM/vNalFfo3aYeY/kG4cMpB874gABv/7YOhHVujf5N2mPpKM1y9YG+0fA/iZ2e+mXRRefmZIZMpsvhCHv7PAkyYexNbVnghOjIYZ485YcHXGfD0Kxctk72jGlfOOeLT2Y1Ey/AwUzxOzGQemf7zngwnDtTDtJWZSPjlD3QOL8YHg5shP9sWAPDtp17YvsYTkxZex8qfLsLNswIzhjRF6V3j/nkS+zgxE1WX6IX8xo0bGDFiBDw8PODo6IgOHTogLc14j0gcOC4fe7e4Y89mD2RdtkfCHD/k3bRFv9dvGy3Dw1J/c0Xix744tNtNtAwPM8XjxEymn0lRJsHBn+pj7IfZaNutBH6B5Xjt/Rz4yMrxwwYPCAKw8wtPDHnnFp7rU4SAFvfw/vJrUJRZ4bcdxv3952dnvpl0JtTAZIJELeQFBQV49tlnYWtri927d+PcuXP45JNPUL9+faPs38ZWjaB2pUhLdtaan5bsjFYhJUbJYA5M8Tgxk3lkUqkkUKsksJOqteZLHdRIP14POdfscCfXFp3DizXv2UkFtO12F+dSnWo9XyWxjxMzGVEdK+KAyIPdFi9eDJlMhnXr1mnmBQQEPHZ5hUIBhUKheS2Xyw3av4u7CtY2QGG+9mEozLOBm5fSoG3XJaZ4nJjJPDI51lOjZecSbF7mA/+gq6jvqcT+nW7444Qj/AIVuJN7P5ebZ4XWem6eFci9blfr+SqJfZyYiQwhaot8165dCAkJwaBBg+Dl5YWOHTti7dq1j10+Pj4erq6umkkmk9VIDuGhb1oSCUz625dYTPE4MZNuxMw0bWUmBAEY1qkN+gW0x84vG+D5lwtgZf1gIO11BEEiyrU+/Ox0Y4qZdMHBbrXgypUrWL16NYKCgrB3715MmDAB77zzDjZs2PDI5WfMmIGioiLNlJWVZdD+5XesoVICbp7a3yRdGyhRkMcr8yqZ4nFiJvPJ5BtQjn9vv4zvLp/GptR0rPzpEpQVEvj4K+D+VyuuINdWa53CfJsqmWuTKRwnZjICniOveWq1Gp06dUJcXBw6duyI8ePH480338Tq1asfubxUKoWLi4vWZAhlhRUunXZEpx7FWvM79Sg26vk5U2eKx4mZzC+TvaMaHt5KFBdaIy3ZBaEvyuHjXw53rwqcOPD3OdeKcgnOHK1n1HOupnScmIn0JWohb9iwIVq1aqU1r2XLlrh27ZrRMmxf0wD/GHYHkUNuQ9bsHsbH3oCXXwV+3OBhtAwPs3dUoUmrUjRpVQoA8JEp0KRVKTx9xbu8wxSPEzOZR6bU/c5I+c0ZOdfskJZcD9P+1QyNmt5D5ODbkEiAl8bmYetKbxza7Yqrf9jj3zH+kDqo8fzLBUbJV0ns48RMtc/YXeurV69Gu3btNA3P0NBQ7N69W/O+IAiIjY2Fr68vHBwcEBERgfT0dL1/LlH7Qp599llcuHBBa97FixfRuHFjo2VI3uUGZzcVhr97C+5eSmResMeHIwKRe8N4A20eFty+FB//3yXN6wmxNwAA+751xydTAkTJZIrHiZnMI1OJ3Brr4hsiP9sWzvVVeLZPId74IBs2f/WmvzopF+X3rLBqRiMUF1mjRcdSxG/5E4711E/ecA0T+zgxkxEY+c5ujRo1wqJFi9CsWTMAQGJiIgYMGICTJ0+idevWWLJkCZYuXYr169cjODgYCxYsQO/evXHhwgU4Ozs/Zet/kwjCw8MWjCclJQVhYWGYO3cuXn31VRw/fhxvvvkm1qxZg+HDhz91fblcDldXV0RgAGwktk9d3mi0RvGYCLVK7ARUh+y9eUrsCFW86NtB7AhUDUqhAvvxHYqKigw+Xfo4lbWi7Zg4WNtV/66BqvJ7OPPlTIOyuru74+OPP8bo0aPh6+uLmJgYTJ8+HcD9K7O8vb2xePFijB8/Xudtitq13qVLF+zYsQNbtmxBmzZtMH/+fCxbtkynIk5ERKSPmupal8vlWtODl0U/jkqlwtatW1FSUoLQ0FBkZGQgJycHkZGRmmWkUinCw8Nx+PBhvX4u0YcZ9uvXD/369RM7BhER1XU11LX+8KXPc+bMQWxs7CNXOXPmDEJDQ3Hv3j3Uq1cPO3bsQKtWrTTF2tvbW2t5b29vZGZm6hVL9EJORERkFDVUyLOysrS61qVS6WNXad68OU6dOoXCwkJs27YNI0eORHJysuZ9iUT7hgmCIFSZ9zQs5ERERHrQ5/JnOzs7zWC3kJAQpKSkYPny5Zrz4jk5OWjYsKFm+dzc3Cqt9KcR/aEpRERExmAKd3YTBAEKhQKBgYHw8fFBUlKS5r3y8nIkJycjLCxMr22yRU5ERJbByJefzZw5E1FRUZDJZCguLsbWrVuxf/9+7NmzBxKJBDExMYiLi0NQUBCCgoIQFxcHR0dHDBs2TK/9sJATERHVglu3buG1115DdnY2XF1d0a5dO+zZswe9e/cGAEybNg1lZWWIjo5GQUEBunbtin379ul1DTnAQk5ERBZCIgiQGHDrFH3X/fLLL5+8PYkEsbGxjx3xrisWciIisgxG7lo3Fg52IyIiMmNskRMRkUUwdOS5qT6PnIWciIgsA7vWiYiIyNSwRV4b+KQxqkkm+DQ9U3zS2LbrR8WOUMUrjbqJHYEewK51IiIic1ZHu9ZZyImIyCLU1RY5z5ETERGZMbbIiYjIMrBrnYiIyLyZave4Idi1TkREZMbYIiciIssgCPcnQ9Y3QSzkRERkEThqnYiIiEwOW+RERGQZOGqdiIjIfEnU9ydD1jdF7FonIiIyY2yRA+g3Mh+DJubB3asCmRftkfCRL84er8dMzFQnMrXpWoxBE24hqG0ZPHwqEDumCY7srS9ankpiHSeVEvhmaSP8b0cDFObaob53OZ4flId/Tb4Bq7+aNmUlVtgU54/je91wt8AWnjIF+ozOwT9ev1Xr+R5mar9PpppJJ3W0a93iW+Th/yzAhLk3sWWFF6Ijg3H2mBMWfJ0BT79yZmKmOpHJ3lGNK+cc8ensRqJleJiYx2nHZ77Yt9EbYxdcxfL9v+P1mdfwXYIvfvrKR7PM+tjGOLW/Piav+BPL9/+OfmOz8eXsABzf61br+R5kir9PpphJV5Wj1g2ZTJGohTwgIAASiaTKNGnSJKNlGDguH3u3uGPPZg9kXbZHwhw/5N20Rb/XbxstAzMxU21K/c0ViR/74tBu4xahJxHzOF1Mc0aXyAJ07lkIL5kCof3uoH2PQvx52kmzzIUTzogYlIc2YXJ4yRSIHJGLgFYlWssYgyn+PpliJp1VXkduyGSCRC3kKSkpyM7O1kxJSUkAgEGDBhll/za2agS1K0VasrPW/LRkZ7QKKTFKBmZiJksj9nFq0aUYZw654uYVewDA1XOO+CPFGZ1eKNQs07JLMVKS3HA72xaCAJw55IKbVxzQIbyo1vNVEvs4mUsmEvkcuaenp9brRYsWoWnTpggPD3/k8gqFAgqFQvNaLpcbtH8XdxWsbYDCfO3DUJhnAzcvpUHbZiZmMoVMpkjs4/TypJsoLbbGO+HtYWUtQK2SYNj0LHR/6e8W5eh5V5EwrQnGdekMaxs1JFbAxCVX0PKZ4lrPV0ns42QumfRRV28IYzKD3crLy7Fp0yZMmTIFEonkkcvEx8dj7ty5Nb7vh3tLJBKIPqiBmXTDTOZLrON0aJcHDmxvgJhVlyELLkVGuhPWxTaGm3c5nh+UDwD46SsfXDxRDx+s+wOefuU4d8wZa2cFws27HO27G9aA0Jcp/j6ZYiad1NHBbiZTyHfu3InCwkKMGjXqscvMmDEDU6ZM0byWy+WQyWTV3qf8jjVUSsDNU/ubpGsDJQryxDk0zMRMdZ3Yx2nDAn+8POkmnhtwvwXeuGUZ8m9IsX2VH54flA9FmQSbF8sw7YuL6NyzEAAQ0KoUV9OdsCvB12iFXOzjZC6ZyIRGrX/55ZeIioqCr6/vY5eRSqVwcXHRmgyhrLDCpdOO6NRDu7usU49inEs17qAWZmImSyH2cVKUWUHy0F8+K2sBwl83+1ApraCssMLDHYNW1oJRxzqJfZzMJZM+6uqodZP4CpWZmYmff/4Z27dvN/q+t69pgKkrsnDxtAPOpzqhz4jb8PKrwI8bPIyehZmYqTbYO6rgG/D32BIfmQJNWpWiuNAGeTftRMkk5nEK6V2IbSt84emngCy4DBlnHfH9moZ4YXAeAMDRWYXW3eTYsNAfdvZqeDZSIP2oC5L/64mRczJrPd+DTPH3yRQz6YxPP6s969atg5eXF/r27Wv0fSfvcoOzmwrD370Fdy8lMi/Y48MRgci9Ic4fOGZippoW3L4UH//fJc3rCbE3AAD7vnXHJ1MCRMkk5nEaOz8DWz6WYc3MQMjzbeHmU47eI25hUMwNzTLvfnYJXy+SYfnbzXC30AYNGikwdPo1vPiacW8IY4q/T6aYydJJBEHcrxhqtRqBgYEYOnQoFi1apNe6crkcrq6uiMAA2EhsaykhkcisrMVOUJVaJXaCKrZdPyp2hCpeadRN7AgmTylUYD++Q1FRkcGnSx+nslaERs2Dja19tbejrLiHI7s/qtWs1SF6i/znn3/GtWvXMHr0aLGjEBFRXVZHR62LPtgtMjISgiAgODhY7ChEREQ1Jj4+Hl26dIGzszO8vLzw0ksv4cKFC1rLCIKA2NhY+Pr6wsHBAREREUhPT9drP6IXciIiImMw9qj15ORkTJo0CUePHkVSUhKUSiUiIyNRUvL3XfCWLFmCpUuXYtWqVUhJSYGPjw969+6N4mLdbz4ketc6ERGRUaiF+5Mh6+thz549Wq8rB3anpaWhR48eEAQBy5Ytw6xZszBw4EAAQGJiIry9vbF582aMHz9ep/2wRU5ERJZBqIEJ9wfPPTg9eOvwJykqun+vfnd3dwBARkYGcnJyEBkZqVlGKpUiPDwchw8f1vnHYiEnIiLSg0wmg6urq2aKj49/6jqCIGDKlCl47rnn0KZNGwBATk4OAMDb21trWW9vb817umDXOhERWQQJDHxoyl//zcrK0rr8TCqVPnXdt956C6dPn8bBgwerbveh2wgKgvDYZ448Cgs5ERFZhhq6s5u+twh/++23sWvXLhw4cACNGjXSzPfx8QFwv2XesGFDzfzc3NwqrfQnYdc6ERFRLRAEAW+99Ra2b9+OX3/9FYGBgVrvBwYGwsfHB0lJSZp55eXlSE5ORlhYmM77YYuciIgsgrGfRz5p0iRs3rwZ3333HZydnTXnvV1dXeHg4ACJRIKYmBjExcUhKCgIQUFBiIuLg6OjI4YNG6bzfljIiYjIMhj5zm6rV68GAERERGjNX7duneaR3dOmTUNZWRmio6NRUFCArl27Yt++fXB2dtZ5PyzkREREtUCXR5lIJBLExsYiNja22vthISciIosgEQRIDBjsZsi6tYmFnMjUmeCTxkyRKT5pjE9kMzHqvyZD1jdBHLVORERkxtgiJyIii8CudSIiInNWR59HzkJORESWoYbu7GZqeI6ciIjIjLFFTkREFsHYd3YzFhZyIiKyDOxaJyIiIlPDFjkREVkEifr+ZMj6poiFnIiILAO71omIiMjUsEVORESWgTeEqbv6jczHoIl5cPeqQOZFeyR85Iuzx+sxEzMxEzMZJZNKCXyztBH+t6MBCnPtUN+7HM8PysO/Jt+A1V/9pmUlVtgU54/je91wt8AWnjIF+ozOwT9ev1Xr+R5mip+dLurqLVotvms9/J8FmDD3Jras8EJ0ZDDOHnPCgq8z4OlXzkzMxEzMZJRMOz7zxb6N3hi74CqW7/8dr8+8hu8SfPHTVz6aZdbHNsap/fUxecWfWL7/d/Qbm40vZwfg+F63Ws/3IFP87CydqIVcqVTiww8/RGBgIBwcHNCkSRPMmzcParXxhgYOHJePvVvcsWezB7Iu2yNhjh/ybtqi3+u3jZaBmZiJmSw708U0Z3SJLEDnnoXwkikQ2u8O2vcoxJ+nnTTLXDjhjIhBeWgTJoeXTIHIEbkIaFWitYwxmOJnp7PKwW6GTCZI1EK+ePFiJCQkYNWqVTh//jyWLFmCjz/+GCtXrjTK/m1s1QhqV4q0ZGet+WnJzmgVUmKUDMzETMzETC26FOPMIVfcvGIPALh6zhF/pDij0wuFmmVadilGSpIbbmfbQhCAM4dccPOKAzqEF9V6vkpiHyeDCfj7meTVmUyzjot7jvzIkSMYMGAA+vbtCwAICAjAli1bkJqa+sjlFQoFFAqF5rVcLjdo/y7uKljbAIX52oehMM8Gbl5Kg7bNTMzETMykq5cn3URpsTXeCW8PK2sBapUEw6ZnoftLf7dyR8+7ioRpTTCuS2dY26ghsQImLrmCls8U13q+SmIfJ0PV1XPkohby5557DgkJCbh48SKCg4Px+++/4+DBg1i2bNkjl4+Pj8fcuXNrPMfDn41EAtG/eTGTbphJN8ykG7EyHdrlgQPbGyBm1WXIgkuRke6EdbGN4eZdjucH5QMAfvrKBxdP1MMH6/6Ap185zh1zxtpZgXDzLkf77oY1avRlip+dJRO1kE+fPh1FRUVo0aIFrK2toVKpsHDhQgwdOvSRy8+YMQNTpkzRvJbL5ZDJZNXev/yONVRKwM1T+5ukawMlCvLEOTTMxEzMZHmZNizwx8uTbuK5Afdb4I1bliH/hhTbV/nh+UH5UJRJsHmxDNO+uIjOPQsBAAGtSnE13Qm7EnyNVsjFPk4GE2DgDWFqLEmNEvUc+TfffINNmzZh8+bNOHHiBBITE/Hvf/8biYmJj1xeKpXCxcVFazKEssIKl047olMP7a6pTj2KcS7VuANImImZmMlyMynKrCB56K+xlbUA4a9xvyqlFZQVVvdbvg8vY8TiIvZxMlgdHewm6leoqVOn4oMPPsCQIUMAAG3btkVmZibi4+MxcuRIo2TYvqYBpq7IwsXTDjif6oQ+I27Dy68CP27wMMr+mYmZmImZQnoXYtsKX3j6KSALLkPGWUd8v6YhXhicBwBwdFahdTc5Niz0h529Gp6NFEg/6oLk/3pi5JzMWs/3IFP87CydqIW8tLQUVlbaX0Otra2NevlZ8i43OLupMPzdW3D3UiLzgj0+HBGI3Bt2RsvATMzETJadaez8DGz5WIY1MwMhz7eFm085eo+4hUExNzTLvPvZJXy9SIblbzfD3UIbNGikwNDp1/Dia8a9IYwpfnY6UwOQPHWpJ69vgiSCIF5fwahRo/Dzzz/j888/R+vWrXHy5EmMGzcOo0ePxuLFi5+6vlwuh6urKyIwADYSWyMkJiLS3bbrR8WOUMUrjbqJHUGLUqjAfnyHoqIig0+XPk5lrejZZhpsrKXV3o5SpcAvZ5fUatbqELVFvnLlSsyePRvR0dHIzc2Fr68vxo8fj48++kjMWERERGZD1ELu7OyMZcuWPfZyMyIiohpTRx9jagbXCxAREdWAOlrILf6hKUREROaMLXIiIrIMbJETERGZMUMemFI56eHAgQPo378/fH19IZFIsHPnTq33BUFAbGwsfH194eDggIiICKSnp+v9Y7GQExGRRah8aIohkz5KSkrQvn17rFq16pHvL1myBEuXLsWqVauQkpICHx8f9O7dG8XF+j0Ih13rREREtSAqKgpRUVGPfE8QBCxbtgyzZs3CwIEDAQCJiYnw9vbG5s2bMX78eJ33wxY5ERFZhhq617pcLteaHny8tq4yMjKQk5ODyMhIzTypVIrw8HAcPnxYr22xkBMRkWVQC4ZPAGQyGVxdXTVTfHy83lFycnIAAN7e3lrzvb29Ne/pil3rREREesjKytK6RatUWv3bvkoeeqSdIAhV5j0NCzkREVmGGrr8rCYeo+3j4wPgfsu8YcOGmvm5ublVWulPw651IiKyEIaeH6+568gDAwPh4+ODpKQkzbzy8nIkJycjLCxMr22xRU7isbIWO0FVapXYCaricTJbpvakMQDYe/OU2BG0yIvVcAsWO0XtuHv3Li5fvqx5nZGRgVOnTsHd3R3+/v6IiYlBXFwcgoKCEBQUhLi4ODg6OmLYsGF67YeFnIiILIOR7+yWmpqK559/XvN6ypQpAICRI0di/fr1mDZtGsrKyhAdHY2CggJ07doV+/btg7Ozs177YSEnIiLLoDawe1yt37oREREQnlD8JRIJYmNjERsbW/1M4DlyIiIis8YWORERWQZBfX8yZH0TxEJORESWoY4+/YyFnIiILIORz5EbC8+RExERmTG2yImIyDKwa52IiMiMCTCwkNdYkhrFrnUiIiIzxhY5ERFZBnatExERmTG1GoAB14KrTfM6cnatA+g3Mh+JR8/j+yunsWrPRbR55q7YkZhJB226FmPuusvYnHoGe6+fQOiLhaLmqcTjpBtTO07MVFXpXSus/sgPr3Vphf5N2iGmfxAunHLQvC8IwMZ/+2Box9bo36Qdpr7SDFcv2BstH91n8YU8/J8FmDD3Jras8EJ0ZDDOHnPCgq8z4OlXzkwmnsneUY0r5xzx6exGomV4GI+TbkzxODFTVf95T4YTB+ph2spMJPzyBzqHF+ODwc2Qn20LAPj2Uy9sX+OJSQuvY+VPF+HmWYEZQ5qi9K6JlhZDHmFqaLd8LRL1aBcXFyMmJgaNGzeGg4MDwsLCkJKSYtQMA8flY+8Wd+zZ7IGsy/ZImOOHvJu26Pf6baPmYCb9pf7misSPfXFot5toGR7G46QbUzxOzKRNUSbBwZ/qY+yH2WjbrQR+geV47f0c+MjK8cMGDwgCsPMLTwx55xae61OEgBb38P7ya1CUWeG3Habzu6aFhbzmjR07FklJSdi4cSPOnDmDyMhI9OrVCzdu3DDK/m1s1QhqV4q0ZO1HxqUlO6NVSIlRMjBT3cHjpBtTPE7MVJVKJYFaJYGdVPu8sNRBjfTj9ZBzzQ53cm3RObxY856dVEDbbndxLtWp1vPR30Qr5GVlZdi2bRuWLFmCHj16oFmzZoiNjUVgYCBWr179yHUUCgXkcrnWZAgXdxWsbYDCfO0xf4V5NnDzUhq0bWayPDxOujHF48RMVTnWU6Nl5xJsXuaD2zk2UKmAX7a54Y8TjrhzywZ3cu/ncvOs0FrPzbMCBbkmOo5aLRg+mSDRCrlSqYRKpYK9vfbACAcHBxw8ePCR68THx8PV1VUzyWSyGsnycG+JRALRL/xnJvPF46QbUzxOzKRt2spMCAIwrFMb9Atoj51fNsDzLxfAyvrBQNrrCIKkyjxTIQhqgydTJFohd3Z2RmhoKObPn4+bN29CpVJh06ZNOHbsGLKzsx+5zowZM1BUVKSZsrKyDMogv2MNlRJw89T+duvaQImCPHG+UTKT+eJx0o0pHidmejTfgHL8e/tlfHf5NDalpmPlT5egrJDAx18B9796BQpybbXWKcy3qZLZZAgGtsZ5jryqjRs3QhAE+Pn5QSqVYsWKFRg2bBisra0fubxUKoWLi4vWZAhlhRUunXZEpx7FWvM79SgW7RwPM5kvHifdmOJxYqYns3dUw8NbieJCa6QluyD0RTl8/Mvh7lWBEwf+PodfUS7BmaP1OCbEyERtJjRt2hTJyckoKSmBXC5Hw4YNMXjwYAQGBhotw/Y1DTB1RRYunnbA+VQn9BlxG15+Ffhxg4fRMjBT9dg7quAboNC89pEp0KRVKYoLbZB3006UTDxOujHF48RMVaXud4YgALKmCtzIsMMX8/3QqOk9RA6+DYkEeGlsHrau9IZfEwX8AhXYssIbUgc1nn+5wCj59CYY+BhTE22Rm0R/n5OTE5ycnFBQUIC9e/diyZIlRtt38i43OLupMPzdW3D3UiLzgj0+HBGI3Bvi/IFjJt0Fty/Fx/93SfN6Quz9qx32feuOT6YEiJKJx0k3pnicmKmqErk11sU3RH62LZzrq/Bsn0K88UE2bP7qTX91Ui7K71lh1YxGKC6yRouOpYjf8icc65nmuWSo1YDEgGwmeo5cIgjifcXYu3cvBEFA8+bNcfnyZUydOhVSqRQHDx6Era3tU9eXy+VwdXVFBAbARvL05cnEWD36FIqo1CqxE1TF40Q1aO/NU2JH0CIvVsMt+AqKiooMPl362H38VSt6Og+HjaT6X4KUQjl+Kf66VrNWh6gt8qKiIsyYMQPXr1+Hu7s7XnnlFSxcuFCnIk5ERKQXdq3XvFdffRWvvvqqmBGIiMhCCGo1BAO61nn5GREREdU4kxjsRkREVOvYtU5ERGTG1AIgqXuFnF3rREREZowtciIisgyCAMCQ68hNs0XOQk5ERBZBUAsQDOhaF/G2K0/EQk5ERJZBUMOwFjkvPyMiIrI4n332GQIDA2Fvb4/OnTvjf//7X41un4WciIgsgqAWDJ709c033yAmJgazZs3CyZMn0b17d0RFReHatWs19nOxkBMRkWUQ1IZPelq6dCnGjBmDsWPHomXLlli2bBlkMhlWr15dYz+WWZ8jrxx4oESFQdf4k0hM8XyTYIIPA+FxohokLzat3yf53ft5jDGQzNBaoUQFgPsPYXmQVCqFVCqtsnx5eTnS0tLwwQcfaM2PjIzE4cOHqx/kIWZdyIuLiwEAB/GTyEmoWkzr74np4nGiGuQWLHaCRysuLoarq2utbNvOzg4+Pj44mGN4rahXrx5kMpnWvDlz5iA2NrbKsvn5+VCpVPD29taa7+3tjZycHIOzVDLrQu7r64usrCw4OztDIpEYtC25XA6ZTIasrCyTeTwdM+nG1DKZWh6AmXTFTLqpyUyCIKC4uBi+vr41lK4qe3t7ZGRkoLy83OBtCYJQpd48qjX+oIeXf9Q2DGHWhdzKygqNGjWq0W26uLiYzD+WSsykG1PLZGp5AGbSFTPppqYy1VZL/EH29vawt7ev9f08qEGDBrC2tq7S+s7Nza3SSjcEB7sRERHVAjs7O3Tu3BlJSUla85OSkhAWFlZj+zHrFjkREZEpmzJlCl577TWEhIQgNDQUa9aswbVr1zBhwoQa2wcL+V+kUinmzJnz1HMdxsRMujG1TKaWB2AmXTGTbkwxk6kaPHgwbt++jXnz5iE7Oxtt2rTBTz/9hMaNG9fYPiSCqd48loiIiJ6K58iJiIjMGAs5ERGRGWMhJyIiMmMs5ERERGaMhRy1/4g5fR04cAD9+/eHr68vJBIJdu7cKWqe+Ph4dOnSBc7OzvDy8sJLL72ECxcuiJpp9erVaNeuneaGFKGhodi9e7eomR4WHx8PiUSCmJgY0TLExsZCIpFoTT4+PqLlqXTjxg2MGDECHh4ecHR0RIcOHZCWliZanoCAgCrHSSKRYNKkSaJlUiqV+PDDDxEYGAgHBwc0adIE8+bNg1ot7j17i4uLERMTg8aNG8PBwQFhYWFISUkRNZOls/hCboxHzOmrpKQE7du3x6pVq0TL8KDk5GRMmjQJR48eRVJSEpRKJSIjI1FSUiJapkaNGmHRokVITU1FamoqXnjhBQwYMADp6emiZXpQSkoK1qxZg3bt2okdBa1bt0Z2drZmOnPmjKh5CgoK8Oyzz8LW1ha7d+/GuXPn8Mknn6B+/fqiZUpJSdE6RpU38Bg0aJBomRYvXoyEhASsWrUK58+fx5IlS/Dxxx9j5cqVomUCgLFjxyIpKQkbN27EmTNnEBkZiV69euHGjRui5rJogoV75plnhAkTJmjNa9GihfDBBx+IlEgbAGHHjh1ix9CSm5srABCSk5PFjqLFzc1N+OKLL8SOIRQXFwtBQUFCUlKSEB4eLkyePFm0LHPmzBHat28v2v4fZfr06cJzzz0ndownmjx5stC0aVNBrVaLlqFv377C6NGjteYNHDhQGDFihEiJBKG0tFSwtrYWfvjhB6357du3F2bNmiVSKrLoFnnlI+YiIyO15tf0I+bqmqKiIgCAu7u7yEnuU6lU2Lp1K0pKShAaGip2HEyaNAl9+/ZFr169xI4CALh06RJ8fX0RGBiIIUOG4MqVK6Lm2bVrF0JCQjBo0CB4eXmhY8eOWLt2raiZHlReXo5NmzZh9OjRNfpgC30999xz+OWXX3Dx4kUAwO+//46DBw+iT58+omVSKpVQqVRV7lnu4OCAgwcPipSKLPrObsZ6xFxdIggCpkyZgueeew5t2rQRNcuZM2cQGhqKe/fuoV69etixYwdatWolaqatW7fixIkTJnPOsGvXrtiwYQOCg4Nx69YtLFiwAGFhYUhPT4eHh4coma5cuYLVq1djypQpmDlzJo4fP4533nkHUqkUr7/+uiiZHrRz504UFhZi1KhRouaYPn06ioqK0KJFC1hbW0OlUmHhwoUYOnSoaJmcnZ0RGhqK+fPno2XLlvD29saWLVtw7NgxBAUFiZbL0ll0Ia9U24+Yq0veeustnD592iS+fTdv3hynTp1CYWEhtm3bhpEjRyI5OVm0Yp6VlYXJkydj3759Rn/K0uNERUVp/r9t27YIDQ1F06ZNkZiYiClTpoiSSa1WIyQkBHFxcQCAjh07Ij09HatXrzaJQv7ll18iKiqqVh+rqYtvvvkGmzZtwubNm9G6dWucOnUKMTEx8PX1xciRI0XLtXHjRowePRp+fn6wtrZGp06dMGzYMJw4cUK0TJbOogu5sR4xV1e8/fbb2LVrFw4cOFDjj4+tDjs7OzRr1gwAEBISgpSUFCxfvhyff/65KHnS0tKQm5uLzp07a+apVCocOHAAq1atgkKhgLW1tSjZKjk5OaFt27a4dOmSaBkaNmxY5ctWy5YtsW3bNpES/S0zMxM///wztm/fLnYUTJ06FR988AGGDBkC4P4XsczMTMTHx4tayJs2bYrk5GSUlJRALpejYcOGGDx4MAIDA0XLZOks+hy5sR4xZ+4EQcBbb72F7du349dffzXZf7CCIEChUIi2/549e+LMmTM4deqUZgoJCcHw4cNx6tQp0Ys4ACgUCpw/fx4NGzYULcOzzz5b5fLFixcv1uhDJKpr3bp18PLyQt++fcWOgtLSUlhZaf+Jtra2Fv3ys0pOTk5o2LAhCgoKsHfvXgwYMEDsSBbLolvkgHEeMaevu3fv4vLly5rXGRkZOHXqFNzd3eHv72/0PJMmTcLmzZvx3XffwdnZWdOD4erqCgcHB6PnAYCZM2ciKioKMpkMxcXF2Lp1K/bv3489e/aIkge4f/7w4XEDTk5O8PDwEG08wfvvv4/+/fvD398fubm5WLBgAeRyuagtunfffRdhYWGIi4vDq6++iuPHj2PNmjVYs2aNaJmA+13+69atw8iRI2FjI/6fxv79+2PhwoXw9/dH69atcfLkSSxduhSjR48WNdfevXshCAKaN2+Oy5cvY+rUqWjevDneeOMNUXNZNFHHzJuITz/9VGjcuLFgZ2cndOrUSfTLqn777TcBQJVp5MiRouR5VBYAwrp160TJIwiCMHr0aM1n5unpKfTs2VPYt2+faHkeR+zLzwYPHiw0bNhQsLW1FXx9fYWBAwcK6enpouWp9P333wtt2rQRpFKp0KJFC2HNmjViRxL27t0rABAuXLggdhRBEARBLpcLkydPFvz9/QV7e3uhSZMmwqxZswSFQiFqrm+++UZo0qSJYGdnJ/j4+AiTJk0SCgsLRc1k6fgYUyIiIjNm0efIiYiIzB0LORERkRljISciIjJjLORERERmjIWciIjIjLGQExERmTEWciIiIjPGQk5ERGTGWMiJDBQbG4sOHTpoXo8aNQovvfSS0XNcvXoVEokEp06deuwyAQEBWLZsmc7bXL9+PerXr29wNolEgp07dxq8HSKqioWc6qRRo0ZBIpFAIpHA1tYWTZo0wfvvv4+SkpJa3/fy5cuxfv16nZbVpfgSET2J+E8GIKol//jHP7Bu3TpUVFTgf//7H8aOHYuSkhKsXr26yrIVFRWwtbWtkf26urrWyHaIiHTBFjnVWVKpFD4+PpDJZBg2bBiGDx+u6d6t7A7/6quv0KRJE0ilUgiCgKKiIowbNw5eXl5wcXHBCy+8gN9//11ru4sWLYK3tzecnZ0xZswY3Lt3T+v9h7vW1Wo1Fi9ejGbNmkEqlcLf3x8LFy4EAM0jYTt27AiJRIKIiAjNeuvWrUPLli1hb2+PFi1a4LPPPtPaz/Hjx9GxY0fY29sjJCQEJ0+e1PsYLV26FG3btoWTkxNkMhmio6Nx9+7dKsvt3LkTwcHBsLe3R+/evZGVlaX1/vfff4/OnTvD3t4eTZo0wdy5c6FUKvXOQ0T6YyEni+Hg4ICKigrN68uXL+Pbb7/Ftm3bNF3bffv2RU5ODn766SekpaWhU6dO6NmzJ+7cuQMA+PbbbzFnzhwsXLgQqampaNiwYZUC+7AZM2Zg8eLFmD17Ns6dO4fNmzfD29sbwP1iDAA///wzsrOzsX37dgDA2rVrMWvWLCxcuBDnz59HXFwcZs+ejcTERABASUkJ+vXrh+bNmyMtLQ2xsbF4//339T4mVlZWWLFiBc6ePYvExET8+uuvmDZtmtYypaWlWLhwIRITE3Ho0CHI5XIMGTJE8/7evXsxYsQIvPPOOzh37hw+//xzrF+/XvNlhYhqmchPXyOqFSNHjhQGDBigeX3s2DHBw8NDePXVVwVBEIQ5c+YItra2Qm5urmaZX375RXBxcRHu3bunta2mTZsKn3/+uSAIghAaGipMmDBB6/2uXbsK7du3f+S+5XK5IJVKhbVr1z4yZ0ZGhgBAOHnypNZ8mUwmbN68WWve/PnzhdDQUEEQBOHzzz8X3N3dhZKSEs37q1evfuS2HtS4cWPhP//5z2Pf//bbbwUPDw/N63Xr1gkAhKNHj2rmnT9/XgAgHDt2TBAEQejevbsQFxentZ2NGzcKDRs21LwGIOzYseOx+yWi6uM5cqqzfvjhB9SrVw9KpRIVFRUYMGAAVq5cqXm/cePG8PT01LxOS0vD3bt34eHhobWdsrIy/PnnnwCA8+fPY8KECVrvh4aG4rfffntkhvPnz0OhUKBnz546587Ly0NWVhbGjBmDN998UzNfqVRqzr+fP38e7du3h6Ojo1YOff3222+Ii4vDuXPnIJfLoVQqce/ePZSUlMDJyQkAYGNjg5CQEM06LVq0QP369XH+/Hk888wzSEtLQ0pKilYLXKVS4d69eygtLdXKSEQ1j4Wc6qznn38eq1evhq2tLXx9fasMZqssVJXUajUaNmyI/fv3V9lWdS/BcnBw0HsdtVoN4H73eteuXbXes7a2BgAIglCtPA/KzMxEnz59MGHCBMyfPx/u7u44ePAgxowZo3UKArh/+djDKuep1WrMnTsXAwcOrLKMvb29wTmJ6MlYyKnOcnJyQrNmzXRevlOnTsjJyYGNjQ0CAgIeuUzLli1x9OhRvP7665p5R48efew2g4KC4ODggF9++QVjx46t8r6dnR2A+y3YSt7e3vDz88OVK1cwfPjwR263VatW2LhxI8rKyjRfFp6U41FSU1OhVCrxySefwMrq/nCZb7/9tspySqUSqampeOaZZwAAFy5cQGFhIVq0aAHg/nG7cOGCXseaiGoOCznRX3r16oXQ0FC89NJLWLx4MZo3b46bN2/ip59+wksvvYSQkBBMnjwZI0eOREhICJ577jl8/fXXSE9PR5MmTR65TXt7e0yfPh3Tpk2DnZ0dnn32WeTl5SE9PR1jxoyBl5cXHBwcsGfPHjRq1Aj29vZwdXVFbGws3nnnHbi4uCAqKgoKhQKpqakoKCjAlClTMGzYMMyaNQtjxozBhx9+iKtXr+Lf//63Xj9v06ZNoVQqsXLlSvTv3x+HDh1CQkJCleVsbW3x9ttvY8WKFbC1tcVbb72Fbt26aQr7Rx99hH79+kEmk2HQoEGwsrLC6dOncebMGSxYsED/D4KI9MJR60R/kUgk+Omnn9CjRw+MHj0awcHBGDJkCK5evaoZZT548GB89NFHmD59Ojp37ozMzExMnDjxidudPXs23nvvPXz00Udo2bIlBg8ejNzcXAD3zz+vWLECn3/+OXx9fTFgwAAAwNixY/HFF19g/fr1aNu2LcLDw7F+/XrN5Wr16tXD999/j3PnzqFjx46YNWsWFi9erNfP26FDByxduhSLFy9GmzZt8PXXXyM+Pr7Kco6Ojpg+fTqGDRuG0NBQODg4YOvWrZr3X3zxRfzwww9ISkpCly5d0K1bNyxduhSNGzfWKw8RVY9EqImTbURERCQKtsiJiIjMGAs5ERGRGWMhJyIiMmMs5ERERGaMhZyIiMiMsZATERGZMRZyIiIiM8ZCTkREZMZYyImIiMwYCzkREZEZYyEnIiIyY/8PNfoX5jFM0ykAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "disp = metrics.ConfusionMatrixDisplay.from_predictions(y_test, predicted)\n",
    "disp.figure_.suptitle(\"Confusion Matrix\")\n",
    "print(f\"Confusion matrix:\\n{disp.confusion_matrix}\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "17f2d8a2-ec0a-43e8-857d-49f0f12a7d18",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report rebuilt from confusion matrix:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       1.00      0.99      0.99        88\n",
      "           1       0.99      0.97      0.98        91\n",
      "           2       0.99      0.99      0.99        86\n",
      "           3       0.98      0.87      0.92        91\n",
      "           4       0.99      0.96      0.97        92\n",
      "           5       0.95      0.97      0.96        91\n",
      "           6       0.99      0.99      0.99        91\n",
      "           7       0.96      0.99      0.97        89\n",
      "           8       0.94      1.00      0.97        88\n",
      "           9       0.93      0.98      0.95        92\n",
      "\n",
      "    accuracy                           0.97       899\n",
      "   macro avg       0.97      0.97      0.97       899\n",
      "weighted avg       0.97      0.97      0.97       899\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# The ground truth and predicted lists\n",
    "y_true = []\n",
    "y_pred = []\n",
    "cm = disp.confusion_matrix\n",
    "\n",
    "# For each cell in the confusion matrix, add the corresponding ground truths\n",
    "# and predictions to the lists\n",
    "for gt in range(len(cm)):\n",
    "    for pred in range(len(cm)):\n",
    "        y_true += [gt] * cm[gt][pred]\n",
    "        y_pred += [pred] * cm[gt][pred]\n",
    "\n",
    "print(\n",
    "    \"Classification report rebuilt from confusion matrix:\\n\"\n",
    "    f\"{metrics.classification_report(y_true, y_pred)}\\n\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "960f00cf-08a0-4855-bf41-7a6aeb375cb6",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:base] *",
   "language": "python",
   "name": "conda-base-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
